2016-10-30 16 views
-1

私はここで新しいプログラマーです。私は1から10,000の範囲で完璧な数字を印刷するプログラムを書こうとしており、完全な数で割り切れるすべての数字をリストアップしています。私はコードのプリセットを与えられ、底は私が現在持っているものです。何が間違っているのですか(何らかの構文がない場合)?関数とプリセットコードを使用して完全な数値を見つける

#include <stdio.h> 
int perfect(int); 
void list_perfect(int); 
int main() { 
    int i;  
    for (i=2; i<10000; i++) { 
     if (perfect(i)) { 
      list_perfect(i); 
     } 
    return 0; 
} 


int perfect(int number) { 
} 
void list_perfect(int number) {  
} 

現在コード:

#include <stdio.h> 
int perfect(int); 
void list_perfect(int); 
int main() { 
    int i; 
    for (i=2; i<10000; i++) { 
     if (perfect(i)) {     
      printf("These are the perfect numbers:\n"); 
      list_perfect(i); 
     } 
    } 
    return 0; 
} 

int perfect(int number) { 
    int sum; 
    int k; 
    sum = 0; 
    for (k=2; k<number; k++) { 
     if(number%k==0) { 
      sum += k; 
     } 
    } 
    if(sum == number) 
     return sum; 
    else 
     return 0; 
    } 
} 

void list_perfect(int number) { 
    if(perfect(number)) { 
     printf("%d", number); 
    } 
} 
+2

何かがここで間違っている:あなたは二回完全数を計算しています。 'list_perfect'は'完璧 'への呼び出しを行い、もしあればそれを表示します。 –

+1

これは「無料のコードをデバッグする」ではありません! –

+0

すみません、私は無意識です – Mariner12

答えて

1

完全数は、その適切な約数の和に等しいです。例えば、6は完全な数であり、整数1 + 2 + 3 = 6に等しい.1はすべての正の整数の共通の除数であるので(負の数も同様)、sum = 1;上記のint complete(int number)関数の中で、sum = 0で始めるのではなく、forループを開始するときに2で始まります。これがあなたの問題だと推測しています。変更を加えて、コードが機能するかどうか確認してください。ありがとうございました。ソリマン。

0

主な問題は、この行です:

for (k=2; k<number; k++) { 

あなたは1から開始する必要があるので、それは

for (k=1; k<number; k++) { 

がより良いパフォーマンスを得るためにあなたができるようになります。

for (k=1; k <= number/2; k++) { 

それ以外には、perfect関数を2回呼び出すべきではありません。ただ印刷する

void list_perfect(int number) { 
    if(perfect(number)) { 
     printf("%d", number); 
    } 
} 

void list_perfect(int number) { 
    printf("%d ", number); 
} 

また、これを修正しますので、これを変更

if(sum == number) 
    return sum; 
else 
    return 0; 
} <-------------------- Delete this line 
関連する問題