2016-12-21 9 views
-1

このコードは、私はgccの上でこのコードをビルドする500と1000エラー:「int型の前に期待表現

との間にプライマー番号を示すことであるが、それはエラーを返す6.2.1が、私は、Visual Studio上で、それをビルドするとき2015年は成功です。

#include <stdio.h> 
    #include <math.h> 
    int primer_number(int a) 
    { 
     int i, m = 0; 
     for (i = 2; i<int(sqrt(double(a))); i++) 
     { 
     if (a%i == 0) return m = 1; 
     } 
    return m; 
    } 

    int main(void) 
    { 
    int i; 
    for (i = 500; i <= 1000; i++) 
    { 
     if (primer_number(i) == 0) printf("%d\n", i); 
    } 
    } 

ここでスクリーンショットgcc 6.2.1

+6

これはあなたの問題です: 'int(sqrt(double(a)))'。 '(int)sqrt((double)a)' – 599644

+5

あるケース(Visual C++)ではC++、もう1つ(gcc)ではCとしてコンパイルされているようです。 Cで有効でないC++のキャストを使用しているために失敗します。 –

+2

BTWでは、 'sqrt'は1回だけ(ループの前に)計算する必要があります。あるいは 'i * i <= a'でテストしてください。 'bool primer_number(int a)'を –

答えて

1

int(sqrt(double(a)))はおそらく、Visual Studioの2015年にはCで、このような発現を可能にするいくつかの非標準の拡張機能を持っているか、あなたはファイルとしてコンパイルされているC++ではなくCの有効な式ですC++ファイルですが。

(int)sqrt(a)に変更してください。さらに、クリーンアップのための

for (i = 2; i< (int)sqrt(a)); i++) 
{ 
    if (a%i == 0) return m = 1; 
} 

提案

あなたは蚊帳の外sqrt(a)への呼び出しを移動することで、より良いパフォーマンスを得ることができます。また、変数mはまったく必要ありません。

int primer_number(int a) 
{ 
    int i; 
    int end = (int)sqrt(a); 
    for (i = 2; i < end; i++) 
    { 
    if (a%i == 0) return 1; 
    } 

    return 0; 
} 

PS機能で使用されるロジックが間違っています。

int primer_number(int a) 
{ 
    int i; 
    for (i = 2; i*i <= a; i++) 
    { 
     if (a%i == 0) return 1; 
    } 
    return 0; 
} 
+0

'9'を非素数として分類していますか?私はそうは思わない。私は 'for(i = 2; i * i <= a; ++ i)' –

+0

@ A.S.Hをお勧めします。 –

+0

ああ、申し訳ありませんが、私はそうすべきではありませんが、そうです。 –

関連する問題