5

我有兴趣找到表现出其适当除数之和等于该数字的属性的数字。第一个示例是 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=" ")    )
}

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

我知道这在这里经常出现,这不是家庭作业问题,只是今天早些时候一位同事冒充一个有趣的编码挑战者。

更新:

感谢大家对寻找更多信息的地方的评论和想法。这是另一个使用 sapply 的解决方案:

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

3 回答 3

6

您正在寻找的东西被称为完美数字(适当的除数之和等于数字本身)。

如果您希望改进方法本身,请参阅此处

要找到适当的除数,您应该改进,作为这样的开始:

  • 您的循环可以在 sqrt(max) 处停止
  • 并且每次你找到一个除数 i 时,max/i 也是一个除数,除非 max/i == i 那么它不应该被计算在内。
于 2010-06-29T01:05:58.780 回答
2

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

于 2011-11-06T18:32:37.090 回答
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;
}

~

于 2013-07-02T11:40:14.070 回答