2010-06-29 3 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 : 장소에 대한 여러분의 의견과 생각에 대한 모든 사람에게

감사 자세한 정보를 볼 수 있습니다.

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

답변

6

당신은 무엇이라고 완전 수를 찾고 (적절한 약수의 합이 것은 수 자체와 동일) : 여기 sapply 이용하여 다른 솔루션입니다.

접근 방법 자체를 개선하려는 경우 see here입니다.

  • SQRT에서 (최대)
  • 그리고 당신은 제수를 찾을 때마다 중지 할 수 있습니다 귀하의 루프 내가, 최대는/내가 수 있습니다 :

    은이 같은 시작으로 당신이 개선해야 적절한 약수를 찾으려면 또한 max/i == i가 아니라면 나눠서는 안됩니다. 이 형태의

+1

또한 홀수 번호를 삭제하여 시작할 수 있습니다 (질문에 대한 내 의견 링크 참조). – nico

+0

완벽한 숫자에 대한 위키 백과 (25,956,377 자리까지)로 알려진 완벽 한 숫자 목록에 링크 된 Wikipedia에 관심이있을 수 있습니다. – nullglob

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

~

관련 문제