编写一个函数来计算R中的除数
我试图用R写一个简单的函数来计算一个数的所有除数。 这就是我希望获得输出的方式:编写一个函数来计算R中的除数,r,function,R,Function,我试图用R写一个简单的函数来计算一个数的所有除数。 这就是我希望获得输出的方式: > divisors(21) [1] 1 3 7 21 我是一个初学者,从下面的代码开始。然而,我认为这是完全错误的,因为它根本不起作用 divisors <- function(number) { x <- c(1:number) for(i in 1:number){ if(number/i == c(x)) { paste(i) } } retu
> divisors(21)
[1] 1 3 7 21
我是一个初学者,从下面的代码开始。然而,我认为这是完全错误的,因为它根本不起作用
divisors <- function(number) {
x <- c(1:number)
for(i in 1:number){
if(number/i == c(x)) {
paste(i)
}
}
return(i)
}
divisors(10)
除数这个怎么样
divisors <- function(x){
# Vector of numberes to test against
y <- seq_len(x)
# Modulo division. If remainder is 0 that number is a divisor of x so return it
y[ x%%y == 0 ]
}
divisors(21)
#[1] 1 3 7 21
divisors(4096)
#[1] 1 2 4 8 16 32 64 128 256 512 1024 2048
这只适用于正自然数
更新:一个使用Rcpp的方法
针对基本R函数运行
require( microbenchmark )
bm <- microbenchmark( divisors(1e6) , divCpp(1e6) )
print( bm , unit = "relative" , digits = 3 , order = "median" )
#Unit: relative
# expr min lq median uq max neval
# divCpp(1e+06) 1.00 1.00 1.00 1.00 1.0 100
# divisors(1e+06) 8.53 8.73 8.55 8.41 11.3 100
require(微基准)
bm或gmp::factorize
,以及其他现有工具
我经常发现,查看发布包的源代码可以很方便地获得执行类似任务的好主意。所以您不希望只使用prime factorzaton,对吗?“你真的应该做更多的搜索。肯定是更多的评论吗?@SimonO101好吧,它很短,但它是一个答案。”。这是一条细线……是的,没错。我正在看你的网站。有兴趣!!漂亮的弹球机集:-)这并没有给出数字的因子,只有素数分解。例如,对于n=75600,当有超过100个因子/除数时,factorize(n)返回2 2 3 3 5 7。@JosephWood OTOH,一旦你有了素因子分解,只需创建相同的所有组合,这在标准R工具中非常容易。
#include <Rcpp.h>
using namespace Rcpp;
//[[Rcpp::export]]
IntegerVector divCpp( int x ){
IntegerVector divs = seq_len( x / 2 );
IntegerVector out(0);
for( int i = 0 ; i < divs.size(); i++){
if( x % divs[i] == 0 )
out.push_back( divs[i] );
}
return out;
}
identical( divCpp( 1e6 ) , divisors( 1e6 ) )
#[1] TRUE
require( microbenchmark )
bm <- microbenchmark( divisors(1e6) , divCpp(1e6) )
print( bm , unit = "relative" , digits = 3 , order = "median" )
#Unit: relative
# expr min lq median uq max neval
# divCpp(1e+06) 1.00 1.00 1.00 1.00 1.0 100
# divisors(1e+06) 8.53 8.73 8.55 8.41 11.3 100