簡體   English   中英

素數檢查不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM