プロジェクトオイラー 問題4
問題はこちら↓
odz.sakura.ne.jp
問題3の解答は出ましたが、時間が1秒以内で終わらなかったので、改善中です!
<アルゴリズム>
・積のところは計算量の削減。
・積が出たら、それぞれの位の数を配列に順に入れていき、反転したものを別の変数に格納していく。
・最初の積と反転後の数値が等しいなら解である。
<ソースコード>
#include <stdio.h> #include <time.h> int main(void){ int num1, num2, num3; int keta, ans = 0; int product[6] = {0};//3桁×3桁は6桁もしくは5桁 clock_t start_clock, end_clock; start_clock = clock(); for(int i = 999; i >= 100; i--){//最初から大きい数を求めに行くスタイル。全数はしない。 for(int j = 999; j > i; j--){ num1 = i * j; num2 = num1; if(ans > num1) break; for(int k = 0; k < 6; k++){//それぞれの位の数を配列に一つ一つ代入していく product[k] = num2 % 10; num2 /= 10; } keta = 1; num3 = 0; for(int k = 5; k >= 0; k--){//位を判定させた者をnum3に代入 num3 += product[k] * keta; keta *= 10; } if(num1 == num3 && ans < num1){//回文数であるかどうかの判定 ans = num1; break; } } } printf("求める解 %d\n", ans); end_clock = clock(); printf("経過時間は%f秒\n", (double)(end_clock - start_clock) / CLOCKS_PER_SEC); return 0; }
<実行結果>
求める解 906609
経過時間は0.000000秒
もっと早くいけそうな...