代码在小输入时运行良好,但在输入很大时就像无限循环一样

时间:2014-10-08 18:29:34

标签: c++

我正在尝试解决一个问题,即找到2百万以上的素数并总结它们并将总和显示为我的输出(有关更多信息,请参阅https://projecteuler.net/problem=10)。我写了这段代码

#include<iostream>
using namespace std;

int main()
{
    int last_range;
    int not_prime_counter=0;
    int sum=0;
    int prime_number_counter=0;
    cout<<"Enter range from 2 to ";
    cin>>last_range;

    int input=2;
    /*
    if(input==1)
    {
    cout<<input<<" is Prime\n";
    sum=sum+input;
    input++;
    }
    */
    if(input==2)
    {
        cout<<input<<" Prime\n";

        sum=sum+input;
        cout<<"Sum : "<<sum<<endl;
        input++;
        prime_number_counter++;
    }
    if(input==3)
    {
        cout<<input<<" Prime\n";

        sum=sum+input;
        cout<<"Sum : "<<sum<<endl;
        input++;
        prime_number_counter++;
    }

    if(input>3)
    {
        for(int i=2;i<=(input/2);i++)
        {
            if(input==last_range)
            {
                break;
            }

            if(input%i==0)
            {
                //cout<<input<<" is NOT Prime\n";
                input++;
                i=2;
            }
            if(i==(input/2) && not_prime_counter==0)
            {
                cout<<input<<" Prime\n";

                sum=sum+input;
                cout<<"Sum : "<<sum<<endl;

                input++;
                i=2;

            }

        }
    }
    cout<<"Final Sum : "<<sum<<endl;



    system("pause");

    return 0;
}

它适用于100,200,但当输入为2000000时,它会永远运行。我想知道为什么会这样,我的问题的解决方案是什么?我想使用单循环。

1 个答案:

答案 0 :(得分:2)

对于大输入,您的算法太慢了。要确定数字是否为素数,您只需要检查它的平方根。

干净而快速地检查数字是否为素数是:

bool prime(int n) {
  if (n == 1) return false;
  if (n == 2) return true;
  if (n % 2 == 0) return false;
  for (i = 3; i*i <= n; i += 2)
     if (n % i == 0) return false;
  return true;
}