- 締切済み
素因数分解のプログラムを作成しました。
素因数分解のプログラムを作成しました。 なぜか11桁を超えた場合、正しく表示されません!! アドバイス等お願いします。 あと、処理時間も組んでみましたがこちらもうまくいきません。 改善をお願いしますm(_ _)m #include<stdio.h> #include<time.h> void fanction(int); void main(void) { int n; clock_t start_time, end_time; printf("整数を入力してください。\n"); scanf("%d",&n); start_time = clock(); fanction(n); end_time = clock(); printf("\n\n処理時間:%.3f秒\n",(double)(end_time - start_time) / CLOCKS_PER_SEC); return 0; } void fanction(int n) { int m; char c='='; for(m=2;n != 1;m++) { while(n%m == 0) { n = n/m; printf("%c%d",c,m); c='*'; } } }
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- akayoroshi
- ベストアンサー率50% (46/91)
回答の訂正です。(int型を32bit符号付きと仮定しています) for (m=2; n!=1; m++) を 誤>for (m=2; n>m*m; m++) に変えて、このループを終了した後でnの値を出力する 正>for(m=2;(m<46340)&&(n>=m*m);m++) に変えて、このループを終了した後に 正>if (n>1) printf("%c%d",c,n); を入れる ここに出てくる46340は最大数2147483647の平方根を切り捨てた値です。mがこれより大きいと、m*mで桁あふれが起きてループが終わらなくなることがあります。
- akayoroshi
- ベストアンサー率50% (46/91)
処理時間をミリ秒単位まで正確に計時できているかどうかは別として、大きな素数を入力すればゼロでない所要時間が表示されます。 たとえば、入力値として、32ビット符号付き整数の最大値2147483647(メルセンヌ素数といわれる素数です)を入れて処理が終わるまで待ってみたらどうでしょうか。 時間を短縮したいなら、 for (m=2; n!=1; m++) を for (m=2; n>m*m; m++) に変えて、このループを終了した後でnの値を出力するようにすると効果があります。
- asuncion
- ベストアンサー率33% (2127/6289)
>処理時間も組んでみましたがこちらもうまくいきません。 どんな風にうまくいかないのか、症状を具体的に書きましょう。 # start_time と end_time とが同じで、どんな数値を素因数分解しても 実行時間がゼロ秒になるってこと?
- kmee
- ベストアンサー率55% (1857/3366)
Cの整数型(char,short,int,long等)は、高々、数~数十bitの精度しかありません。 例えば、WindowsのVisual C++なら、int型は32bitであり、(- 2の31乗)から(2の31乗 -1)までの数しか表わせません。
- tatsu99
- ベストアンサー率52% (391/751)
ロジックは見ていませんが、int型で扱える数値は、10桁までです。 正確には2147483647が正の最大値です。これより大きい値を扱うことはできません。