プロジェクトオイラー 問題21
問題はこちら↓
http://odz.sakura.ne.jp/projecteuler/?Problem+21
番号飛んでるやん!って思ったそこのあなた!そうです(笑)
見たところすぐに書けそうだったので解きました!
<アルゴリズム>
・1から10000までの数を調べていく。
・関数sumyakuに調べる数を渡し、約数の和を返してもらう。
・友愛数であるかの判定はif文で。
<ソースコード>
#include<stdio.h> #include<time.h> #define MAXNUMBER 10000 int sumyaku(int n){//整数を受け取り、その整数の約数を足して言った数をint型の整数sumに入れて返す関数 int sum = 0; for(int i = 1; i <= n/2; i++)//捜索範囲を半減 if(n % i ==0) sum += i; return sum; } int main(void){ int b, sum = 0; clock_t start_clock, end_clock; start_clock = clock(); for(int i = 1; i < MAXNUMBER; i++){ b = sumyaku(i);//関数sinyakuに入れて戻ってきたものをint型の変数bに格納 if(sumyaku(b) == i && i!= b)//題意に沿っているかの確認 sum += i; } printf("%d", sum); end_clock = clock(); printf("\n"); printf("経過時間%f秒\n", (double)(end_clock - start_clock) / CLOCKS_PER_SEC); return 0; }
<実行結果>
31626
経過時間0.247000秒
経過時間に納得のいかない...