初级C++:奇怪的行为

Beginner C++: Strange Behaviour

本文关键字:C++ 初级      更新时间:2023-10-16

感谢您花时间阅读此问题!

这个程序是找出十亿之后最小的素数。在int main()的末尾,我包含了一个控制台输入cin>>x;,目的是防止命令提示符关闭得太快,这样我就可以看到结果。然而,我意识到我必须先输入一些内容,然后它才能显示我想要的结果。

所以问题是:即使控制台输出语句cout<<i;在输入语句cin>>x;之前,为什么会出现这种情况?

#include <iostream>
#include <math.h>
using namespace std;
int is_prime(int x);
int main()
{
    for (int i=100000000;;i++){ 
        if(is_prime(i)){ 
                cout<<i;
                break;}
    int x;
    cin>>x;
       }
}
int is_prime(int x)
{
    double maxvalue = sqrt(static_cast<double>(x));
    for ( int i=2;i<=maxvalue;i++){
        if (x%i == 0 ) return false; }
        return true;
}

似乎cin>>x在for循环中。因此,循环的每一次迭代,您都会尝试从流中读取一些内容。所以,在i变成素数之前,你需要输入一些数字。

编辑:显然,1000003是素数,所以你不必输入很多数字。

为什么即使控制台输出语句cout<<i;在输入语句cin>>x;之前也是如此?

因为break改变了执行顺序,一旦找到素数,就让控制跳过cin >> x。您需要将cin >> x移出循环。

你可以做几件事来优化事情:与其试图除以1sqrt(N)的每一个数字,不如只除以迄今为止找到的素数。这会大大加快速度。您也可以使用i*i < x作为退出条件来放弃对sqrt的调用。