2012-01-09 11 views
2

この小さなCスクリプトは、数字がプライムであるかどうかをチェックします...残念ながら、完全には機能しません。スクリプトの非効率性を認識しています(例:sqrt最適化)。これは問題ではありません。なぜ大数の素数のチェック結果が間違っていますか?

#include <stdio.h> 

int main() { 
    int n, m; 

    printf("Enter an integer, that will be checked:\n"); // Set 'n' from commandline 
    scanf("%d", &n); // Set 'n' from commandline 

    //n = 5; // To specify 'n' inside code. 

    for (m = n-1; m >= 1; m--) { 
    if (m == 1) { 
     printf("The entered integer IS a prime.\n"); 
     break; 
    } 
    if (n % m == 0) { 
     printf("The entered integer IS NOT a prime.\n"); 
     break; 
    } 
    } 
    return 0; 
} 

私は数字の多くのプログラムの開発をテストし、それが働いていた...それから私は ...はっきりプライムない大きな数(1231231231231236)を試みたが、:プログラムはそれがあった私に言いました! ?

私には何が欠けていますか?

+0

32ビット整数の制限を確認してください。これはおそらくオーバフローエラーの結果でした – ford

+1

'printf("入力された整数は素数ではありません); 'try' printf( "%dは素数ではありません。\ n"、n); ' – pmg

答えて

6

数字「1231231231231236」が大きすぎて「int」データ型に収まりません。あなたのプログラムがあなたに与えた数を示すprintf文を追加し、それが素数であればあなたのプログラムは正常に動作します。それ以外の場合は、メリットチェックの問題があるかもしれません。任意のサイズの整数のサポートを追加するには、かなりの労力が必要です。

このような問題が発生した理由は、intのようなint型のデータ型は固定サイズ(おそらく32ビットまたは4バイト)です。そのため、int型の変数は2^32の固有値(約40億)しか表現できません。 unsigned intを使用していても(あなたはそうではありません)、int型は約40億を超える数値を格納するために使用できませんでした。あなたの数値はそれよりも数桁大きいので、入力をint変数に入れようとすると何か起こりますが、何が起こらないかはわかります。値は1231231231231236に割り当てられません。

+0

どのように私はそれがあまりにも長いintを衰退させることができますか、もう一度それを入力するか? – Nekcihc

+0

入力を文字列として読み取ってから、0から9までの数字だけであることを確認し、8文字以内であることを確認することができます。これにより、1,000,000,000未満の数に制限されますが、これは32ビット整数に当てはまります。 – Patrick87

1

詳細はわかりませんが、intが32ビットの場合、渡した値は許容範囲外です。これは間違いなくあなたが持っている値以外の値として表されます合格。代わりにunsigned intを使用することを検討してください。

1

指定された数値は、Cの整数には大きすぎます。おそらく、その一部を受け入れただけです。 nの値を印刷してみてください。

関連する問題