我遇到此代码的问题。虽然它应该说这个数字不是素数,因为我把一个非常大的数字,我知道是非主要的(252345435465,甚至1000000000000作为一个例子),它说明这个数字是素数。
#include "stdafx.h"
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int n;
int i;
int prime = true;
cout << "Type in a number and press ENTER: ";
cin >> n;
i = 2;
while (i <= sqrt(n)) {
if (n % i == 0) {
prime = false;
break;
}
i++;
}
if (prime)
cout << "The number is prime" << endl;
else
cout << "The number is NOT prime" << endl;
system("PAUSE");
return 0;
}
我有什么问题吗?
答案 0 :(得分:2)
您输入的值太大而无法容纳int
。它们溢出了signed int的32位限制(-2147483648到2147483647)。
答案 1 :(得分:2)
首先,为了避免包含非标准标题<stdafx.h>
,只需关闭Visual C ++项目中的预编译标题(右键单击项目,然后单击属性)。
主要问题是您输入的值太大而不适合int
类型。
要检测到这一点,只需在输入操作后检查流的状态:
#include <iostream>
#include <stdlib.h> // EXIT_FAILURE
#include <cmath>
using namespace std;
int main() {
int n;
int i;
int prime = true;
cout << "Type in a number and press ENTER: ";
cin >> n;
if( cin.fail() )
{
cout << "Sorry, that's not a valid `int` number." << endl;
return EXIT_FAILURE;
}
i = 2;
while (i <= sqrt(n)) {
if (n % i == 0) {
prime = false;
break;
}
i++;
}
if (prime)
cout << "The number is prime" << endl;
else
cout << "The number is NOT prime" << endl;
system("PAUSE");
return 0;
}
答案 2 :(得分:1)
32位signed int
可以取-2,147,483,648到2,147,483,647之间的值范围。你的号码太大了。
使用更合适的变量类型,或仅输入您正在使用的变量范围内的数字。
有关C ++数据类型及其范围的更多信息,请参阅this answer。