2012-02-24 30 views
3

私はループの中に私のコードでエラーが出る、for (j = 3; j <=sqrt(num); j +=2)'複数のオーバーロードされた関数 "sqrt"のインスタンスが引数リストと一致する場合はどうすればよいですか?

オーバーロードされた関数の1つのインスタンスよりは「SQRTは、」引数リストと一致しました。

どうすれば解決できますか?

# include <cmath> 

// determine if number is prime 
bool isPrime (long n) 
{ 
    int j, num = 0; 
    { 
    if (num <=1) 
     return false; 
    } 
    for (j = 3; j <=sqrt(num); j +=2) 
    { 
    if (num % j == 0) 
     return false; 
    } 
    return true; 
} 
+0

あなたの 'sqrt()'関数は何ですか?それをオーバーロードしましたか?コンパイラはあなたにどのような候補を表示しますか? – amit

+1

'int j、num = 0; { if(num <= 1) falseを返します。 } 'これは、' isPrime'が毎回falseを返すのではないでしょうか? – chris

+1

@chris:確かに。それが修正されると、次のループは2を除いた任意の数に対してfalseを返します。 –

答えて

-1

sqrtの機能を記述する必要があります。おそらく最も簡単な方法はNewton's methodです。また、ループ内で毎回sqrt関数を呼び出さないでください。ただ一度それを呼んでください。

+5

複数の 'sqrt'関数が利用可能であることは明らかです。なぜこの人は別のものを書く必要がありますか? –

+0

誰も彼が望んでいるものはまったくありません。彼は正方形の穴に丸いペグを詰め込むことができたと思います。しかし、それを正しく行うには、5行か6行のコードを話しています。 –

+2

@DavidSchwartz:彼らはすべて彼が望むものを正確に行います。彼らは彼が持っている正確なタイプのために過負荷にならないだけです。彼は5〜6行のコードとそれをテストするために数十ダースを書くことができ、彼はそれがすべて正しいと思っています。しかし、私たちは正しいことをするライブラリ関数への単一の呼び出しを話しています。 –

9

試してみてください。何が起こっている

for (j = 3; j <= std::sqrt(static_cast<float>(num)); j +=2) 

<cmath>が3異なるdefinitions of sqrtが含まれていることで、コンパイラは、使用しようとしている1知りません。

+1

また、 'std :: sqrt'であり、おそらく' static_cast (num) 'でなければなりません。 –

+0

以前に掲載されたコードOPに "using namespace std"がありました。私はstatic_castの発言を取る:D – mfontanini

0

2番目の関数の後ろに角括弧がありません -lmタグでコンパイルしていますか?

さらに、タイプキャストjをintとして指定する必要があります。

関連する問題