[英]Prime number check doesn't work as it should
我會盡量保持簡短。 所以我的任務是找到數組中的最后一個素數,如果有的話。 但是現在我的程序將它想要的任何數字從數組分配給 lastPrimeNumber 變量。 有任何想法嗎?
#include <iostream>
#include <time.h>
using namespace std;
int main()
{
srand(time(NULL));
int numbers[10] = {0};
int numbersCount = 10;
bool areEven = true;
cout << "Numbers: ";
for (int i = 0; i < numbersCount; i++)
{
numbers[i] = rand() % 10 + 1;
cout << numbers[i] << " ";
}
for (int i = 0; i < numbersCount; i++)
{
if (numbers[i] % 2 != 0)
{
cout << "\nNot all numbers are even" << endl;
areEven = false;
break;
}
if (areEven)
{
cout << "\nAll numbers are even" << endl;
break;
}
}
// Looking for the last prime number in an array
int lastPrimeNumber = 0;
bool isPrime = true;
for (int i = 0; i < numbersCount; i++)
{
for (int j = 2; j < numbers[i]/2; j++)
{
if (numbers[i] % j == 0 || numbers[i] < 2)
{
isPrime = false;
}
}
if(isPrime)
{
lastPrimeNumber = numbers[i];
}
}
cout << endl << lastPrimeNumber;
return 0;
}
提前致謝。
簡單的修復,改變
bool isPrime = true;
for (int i = 0; i < numbersCount; i++)
{
到
for (int i = 0; i < numbersCount; i++)
{
bool isPrime = true;
在您的版本中,一旦將isPrime
設置為 false,您就再也不會將其設置回 true。
對於初學者來說,這個 for 循環
for (int i = 0; i < numbersCount; i++)
{
if (numbers[i] % 2 != 0)
{
cout << "\nNot all numbers are even" << endl;
areEven = false;
break;
}
if (areEven)
{
cout << "\nAll numbers are even" << endl;
break;
}
}
包含邏輯錯誤。 如果數組的第一個元素是偶數,則程序輸出
cout << "\nAll numbers are even" << endl;
這通常是錯誤的。
相反,你應該寫例如
for (int i = 0; areEven && i < numbersCount; i++)
{
areEven = numbers[i] % 2 == 0;
}
if ( areEven )
{
cout << "\nAll numbers are even" << endl;
}
else
{
cout << "\nNot all numbers are even" << endl;
}
在這些 for 循環中
int lastPrimeNumber = 0;
bool isPrime = true;
for (int i = 0; i < numbersCount; i++)
{
for (int j = 2; j < numbers[i]/2; j++)
{
if (numbers[i] % j == 0 || numbers[i] < 2)
{
isPrime = false;
}
}
if(isPrime)
{
lastPrimeNumber = numbers[i];
}
}
您不會在內部 for 循環之前重置變量isPrime
。
而且for循環中的條件不正確
for (int j = 2; j < numbers[i]/2; j++)
由於條件,數字4
可以被認為是質數。
而且這個條件
numbers[i] < 2
在這個 if 語句中
if (numbers[i] % j == 0 || numbers[i] < 2)
永遠不能評估為真。
至少你應該寫
int lastPrimeNumber = 0;
for (int i = 0; i < numbersCount; i++)
{
bool isPrime = not ( numbers[i] < 2 );
for (int j = 2; isPrime && j <= numbers[i]/2; j++)
{
if (numbers[i] % j == 0)
{
isPrime = false;
}
}
if(isPrime)
{
lastPrimeNumber = numbers[i];
}
}
更好的方法如下。
int lastPrimeNumber = 0;
for (int i = 0; i < numbersCount; i++)
{
bool isPrime = numbers[i] % 2 == 0 ? numbers[i] == 2 : numbers[i] != 1;
for ( int j = 3; isPrime && j <= numbers[i] / j; j += 2 )
{
if (numbers[i] % j == 0)
{
isPrime = false;
}
}
if(isPrime)
{
lastPrimeNumber = numbers[i];
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.