为什么编写的代码在执行时有溢出错误

时间:2018-12-29 14:40:26

标签: c++

该程序将查找最大数为600851475143的素数因子。对于任何给定不小于max_int的给定数,它均适用。

我在代码块中运行代码。

#include<iostream>
using namespace std;

int main()
{

    unsigned  long long a =600851475143 ,prime=2,i,j;
    for(i = 1;i < a/2;i++) {
        int count =1;

        if( (a%i)==0) {
            for(  j = 2;j <=(i/2);j++)
                if(i%j==0)
                    count = 0;

             if(count == 1)
                 prime = i;

        }
    }
    cout<<prime;        
}

预期结果是最大的主要因素600851475143 但是输出什么也没有,只是空白屏幕

1 个答案:

答案 0 :(得分:1)

我认为您会发生时间溢出,您至少要执行600851475143/2次操作,考虑到这100万,实际上很多。的操作大约在0.1秒内执行; 您可以通过不使用a / 2而是使用sqrt(a)来对其进行优化,更多有关此处的原因(https://en.wikipedia.org/wiki/Primality_test

#include<iostream>
using namespace std;

int main(){
    unsigned long long a = 600851475143 ,prime = 2,i,j;
    for(i = 1; i*i < a; i++){
        int count = 1;
        if((a%i) == 0){
            //check if i is prime
            for(j = 2; j*j <= i && count;j++)
                if(i%j == 0)
                    count = 0;
            if(count == 1){
                prime = max(prime,i);
            }
            //check if a/i is prime
            count = 1;
            for(j = 2; j*j <= a/i && count;j++)
                if(a/i%j == 0)
                    count = 0;
            if(count == 1){
                prime = max(prime, a/i);
            }
        }
    }
    cout << prime;
}

现在我们大约有100万。首先执行的操作数。

另外,最好检查a / i是否也为质数,因为数字为coul