素数c ++

时间:2016-07-28 20:35:29

标签: c++

我有这段代码:

#include <iostream>
#include <cmath>

using namespace std;

int n, liczba;

int main()
{
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> liczba;
        if (liczba < 2) {
            cout << "NIE" << endl;
        } else if (liczba == 2) {
            cout << "TAK" << endl;
        }

        for (int i = 2; i < liczba; i++) {
            if (liczba % i == 0) {
                cout << "NIE" << endl;
                break;
            } else if (liczba % i != 0) {
                cout << "TAK" << endl;
                break;
            }
        }
    }
    return 0;
}

该程序应该写为是"TAK"或不是"NIE",无论您输入的数字是素数还是不是。变量n是您要输入程序的数字的数量,而liczba是您要检查它是否为素数的数字。似乎工作正常,期待一件重要的事情。如果我输入数字9,它会显示是"TAK"而不是"NIE" ..我发现这会发生在数字:9,27,45,63,81等等...如果我添加18来自9它每次都会发生。

我的代码出了什么问题?

3 个答案:

答案 0 :(得分:3)

break测试if()。有效地你只会测试一个除数:

e.g。 liczba = 9

1. if (liczba % 2 == 0) -> if (9 % 2 == 0) -> if (1 == 0) -> false
2. ...jump to else
3. if (liczba % 2 != 0) -> if (9 % 2 != 0) -> if (1 != 0) -> TRUE
4. spit out 'tak' and break out of the loop

如果你得到剩余的话,你不能“早点”摆脱循环。这意味着您测试的除数是 NOT 数字的一个因子。如果你得到0的余数,你只能提前破解,这意味着数字不是素数 - 它是复合数。

答案 1 :(得分:3)

提示:

  

所有素数(2和3除外)都可以用6k+1的形式表示   或6k-1,其中k是正整数。

因此,这应该有效:

bool IsPrime( int number )
{

 if ( ( (!(number & 1)) && number != 2 ) || (number < 2) || (number % 3 == 0 && number != 3) )
      return (false);

 for( int k = 1; 36*k*k-12*k < number;++k)
     if ( (number % (6*k+1) == 0) || (number % (6*k-1) == 0) )
         return (false);
     return true;
}

取自Determining if a number is prime

答案 2 :(得分:1)

您没有使用过旗帜,因此在首次检查后会显示NIE。此外,您缺少else语句。 试试这个:

#include <iostream>
#include <cmath>
using namespace std;
int n,liczba;
int main()
{
    cin >> n; //
    for(int i=0;i<n;i++)
        {
            cin>>liczba;
            if (liczba < 2)
                {
                cout << "NIE" << endl;
                }
            else if (liczba == 2)
            {
                cout << "TAK" << endl;
            }
            else
            {
                bool isPrime = true;
                for (int i=2;i<liczba;i++)
                {

                    if (liczba % i == 0)
                        {
                            isPrime = false;
                            break;
                        } 
                }
                if(isPrime)
                    cout<<"TAK";
                else
                    cout<<"NIE";
            }

        }
    return 0;
}

目前,如果您输入7,它将检查是否7 % 2 == 0。由于它不是,它将打印“NIE”并突破循环。