这个程序有限制吗?

3

我在处理这段代码时遇到了问题。尽管我输入了一个明显不是质数的超大数字(例如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;
}

我做错了什么吗?


2
你有没有考虑过你的示例中的值是否大于最大 int 值? - user2573153
3个回答

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;
}

stdafx.h 实际上并没有什么非标准的地方。就标准 C++ 而言,它只是另一个头文件而已。当然,使用任何头文件都违反了自包含示例的思想。 - MSalters
@MSalters:有两个非标准问题。首先,最明显的是,它不是由C++标准定义的头文件。这通常被称为“非标准头文件”,也是我使用该术语的含义。其次,它的目的是支持Microsoft预编译头文件(在典型的Visual Studio项目中,这就是“标准”预编译头文件),它定义了与标准C++略有不同的语言,因此一些有效的C++标准代码无法编译(新手经常感到困惑),而一些无效的C++代码却可以编译。 - Cheers and hth. - Alf

2
您输入的值对于int类型来说过大了。它们超出了有符号整数32位限制的范围(-2147483648至2147483647)。

2
请注意,上述限制仅适用于特定的C++实现。即使是64位的Windows C++编译器也会有这些限制。其他编译器可能具有更大或更小的限制(对于16位符号和幅度表示,int最小限制为-32.767到+32.767,包括在内,如果我没记错的话)。 - Cheers and hth. - Alf

1

32位的有符号整数可以取值范围在-2,147,483,648到2,147,483,647之间。你输入的数字超出了这个范围。

要么使用更合适的变量类型,要么只输入在所使用变量范围内的数字。

有关C++数据类型及其范围的更多信息,请参见this answer


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接