2010-06-29 79 views
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=" ") ) 
} 

有沒有人有任何建議,以改善下面的代碼?我覺得應該在這裏使用一個應用函數。也許這將是一個體面的代碼高爾夫球運動的未來?

而且據我所知,這個問題在這裏出現得有點頻繁,這不是一個家庭作業問題,而只是一個同事今天早些時候提出的一個有趣的編碼挑戰者。

UPDATE:

感謝大家對你的意見和想法對地方尋找更多的信息。這裏有另一種利用sapply的解決方案:

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

你可能想看看這裏檢查你的結果:http://www.research.att.com/~njas/sequences/A000396 – nico 2010-06-29 05:53:42

回答

6

你在找什麼叫做完美數字(正確除數的總和等於數字本身)。

如果您正在尋求改進方法本身,see here

要找到合適的除數,你應該提高,因爲像這樣的開始:

  • 你的循環可以在開方停止(最大值)
  • 每一次你找到一個除數時間我,最大/我是一個除數,除非最大/我==我然後它不應該被計數。
+1

此外,你可以開始放棄奇數(請參閱我對該問題的評論中的鏈接) – nico 2010-06-29 06:54:14

+0

您可能也有興趣在維基百科的完美數字,鏈接到已知完美數字(最多25,956,377位數字)列表。 – nullglob 2010-06-29 07:46:19

2

的2形式的數字^(N-1)*(2^N-1)是完美的數字,如果2^N - 1是素數

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; 
}