确定适当除数的算法

时间:2010-06-29 00:57:52

标签: r refactoring apply

我感兴趣的是找到具有将其适当除数的总和等于数字的属性的数字。第一个例子是6,其中适当的除数是1 + 2 + 3 = 6。

我在R中编写了以下代码,但我觉得它效率很低,可以大大改进。

propDivisor <- function(
    max
)
{
    n<-{}
    for(j in 2:max){
        m<-{}
        for(i in 1:(j/2+1)){
            if(j%%i==0){m<-c(m,i)}
        }   
        if(sum(m)==j){n<-c(n,j)}
    }
return(cat("The proper divisors between 1 and", max, "are", n, ".", sep=" ")    )
}

有没有人有任何改进以下代码的建议?我觉得应该在这里使用其中一个apply函数。也许这对未来来说是一个不错的代码高尔夫练习?

据我所知,这在某种程度上经常出现,这不是一个家庭作业问题,而是一个同事今天早些时候作为一个有趣的编码挑战者提出的问题。

更新:

感谢大家对于寻找更多信息的地方的意见和想法。这是利用sapply的另一种解决方案:

D <- function(n) sum((1:(n-1))[n%%1:(n-1)==0])==n
(2:9000)[sapply(2:9000,D)]

3 个答案:

答案 0 :(得分:6)

您正在寻找的是完美数字(适当除数的总和等于数字本身)。

如果您希望改进方法本身,see here

要找到适当的除数,你应该改进,作为这样一个开头:

  • 您的循环可以停在sqrt(最大)
  • 每当你找到一个除数i时,max / i也是一个除数,除非max / i == i然后它不应该被计算。

答案 1 :(得分:2)

如果2 ^ n - 1是素数,则2 ^(n-1)*(2 ^ n -1)形式的数字是完美数字

答案 2 :(得分:0)

#include<stdio.h>
#include<math.h>
int main()
{
        int t;
        scanf("%d",&t);
        while(t--)
        {
                long long int n,i,sum= -n;
                scanf("%lld",&n);
                for(i=1;i<=sqrt(n);i++)
                {
                        if(n%i==0)
                        sum = sum + i + n/i;
                }
                printf("%lld\n",sum);
        }
        return 0;
}