2

bool 関数を使用して、最初の 20 個の正の数が素数であるかどうかをチェックする次のコードがあります。

#include <iostream>
#include <cmath>
using namespace std;

bool prime(int);
/* 
function to evaluate whether a positive integer is prime (true)
or not prime (false)
*/
int main()
{
    for(int x=1; x<=20; x++)
    {
        cout <<  x << " a prime ? (1 yes, 0 no) "
             << prime(x) << endl;
    }
    return 0;
}

bool prime(int x)
{
    for(int i=2; i<= sqrt(x); i++)
    {
        if ((x%i) != 0)
            return true;
        else
            return false;
    }
}

出力がの代わりにある場所を1 to 20除いて、すべての数値に対して機能します。私はその理由を知っていると思います。またはのようなループはありません。2 and 301x = 2 and 3ifori<=sqrt(2)i<=sqrt(3)

これらの値でも機能するようにコードを変更するにはどうすればよいですか?

エラーメッセージもあります"Control may reach end of non-void function"。どうしてこれなの?

ありがとう。

4

4 に答える 4

9

プライム関数を次のように変更します

bool prime(int x)
{
  if (x < 2) return false;
  for(int i=2; i<= sqrt(x); i++) {
    if ((x%i) == 0) return false;
  }
  return true;
}

エラー メッセージは、Control may reach end of non-void functionprime 関数がすべての場合に返されるわけではないことを示し1ています (関数に渡すと、for ループに入らないため、明示的に何も返さずに終了し、未定義の動作につながる可能性があります)。一般に、条件付き構造の外に return 命令が必要です。

于 2012-11-22T12:24:03.933 に答える
4

関数の間違った場所に戻りますprime

bool prime(int x) {
    for(int i=2; i<= sqrt(x); i++) {
        if ((x%i) == 0)
            return false;
    }
    return true;
}

既存の関数では、最初の のみをテストしますi。コンパイラの警告は、ループが返されずに終了した場合 (決して返らないことは簡単にわかりますが)、prime値を返さずに制御が終了する方法を示しています。

于 2012-11-22T12:24:29.197 に答える
0

sqrt関数を必要とせずにこれを使用することもできます、そこにあります

bool prime (int num){
int i,temp;
for (i=2; i<=num/2) && temp; i++)
if (num%i==0)
temp = 0;
return temp;}
于 2015-01-06T08:10:28.667 に答える
0

サイクルから true を返す結果を抽出します!

bool prime( int _x )
{
    double x = sqrt( _x );
    for( int i = 2; i <= x; ++i )
        if ( !( _x % i ) )
            return false;
    return true;
}
于 2012-11-22T12:34:31.927 に答える