我有这段代码:
#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
它每次都会发生。
我的代码出了什么问题?
答案 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;
}
答案 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”并突破循环。