私はこのプログラムを数時間作成しようとしていますが、私は完全に困惑しています。私はコードブロックでGNU GCCコンパイラを使用しています。修正がない0
から、1
からあなたのループを開始することです:数字がプライムであるかどうかを定義する関数は、C++プログラムがクラッシュする原因となります。
...
for (int i = 1; i <= number; i++) {
...
、あなたDR;それはおそらく愚かなものだが、私はプログラミング
私はこのプログラムを数時間作成しようとしていますが、私は完全に困惑しています。私はコードブロックでGNU GCCコンパイラを使用しています。修正がない0
から、1
からあなたのループを開始することです:数字がプライムであるかどうかを定義する関数は、C++プログラムがクラッシュする原因となります。
...
for (int i = 1; i <= number; i++) {
...
、あなたDR;それはおそらく愚かなものだが、私はプログラミング
TLにのみ新しいです
#include <iostream>
using namespace std;
bool Is_Prime(int number);
int main() {
if (Is_Prime(3)) {
cout << "Prime" << endl;
}
system("pause");
}
bool Is_Prime(int number) {
int x = 0;
for (int i = 0; i <= number; i++) {
if ((number % i) == 0) {
x = x + 1;
}
if (x > 2) {
return false;
}
}
return true;
}
1
からnumber
までのすべての番号をチェックして、number
がプライムであることを確認する必要はありません。最初の除数が見つかるとすぐに、number
は素数ではないことが分かります。 1
からsqrt(number)
までの約数が見つからない場合は、number
が素数であることを確認できます。また、特別なケースの1
もあります。
だから、私はあなたのコードビットを強化しましょう:
UPbool Is_Prime(int number)
{
for (int i = 2; i * i <= number; ++i)
{
if (number % i == 0)
{
return false;
}
}
return number > 1;
}
:あなたはあなたのプログラムがstd::numeric_limits<int>::max()
に近い数字のために実行することができることを期待する場合も、その行i * i
がオーバーフローする可能性があります。この場合、あなたは読みにくく、しかし安全な代替使用することができます:
i <= number/i
あなたは%
演算子(N3337 5.6乗法演算子、段落4)の第二のオペランドとして0を使用して未定義の動作を呼び出し、それが作られたと思われますプログラムがクラッシュします。
もう1つの注意点は、1以下の整数は素数ではないため、ループの前に拒否する必要があることです。
モジュロ演算子 '%'は*除算*を実行していますが、0での除算は...? –
すばやくお返事いただきありがとうございます。コードのバージョンをすばやく編集し、動作するかどうかを確認します –
ご協力ありがとうございました –