我的代码不适用于大数字

时间:2014-05-09 00:48:09

标签: c++ c math

看看,上面的代码用于计算2000000以下的素数之和,但是它没有给出正确的答案但是当我试图将10以下的素数相加或者20给出了正确的答案时,任何人都可以帮忙我发现什么事情正在发生!?

#include <stdio.h>
#include <math.h>

int main(){

    unsigned int ref = 0, m,divisoes = 0 , total = 0,flag = 2;
    unsigned int soma =0;

    while(ref < 9999999999999){
        ref = (flag * 2)-1;
        m = ceil(sqrt(ref));
        while( m > 2){
            if(ref % m == 0)
                divisoes++;
            m--;            
        }
        if(divisoes == 0){
            if( ref > 2000000) // limitador
             break;
            printf("%d \n",ref);
            soma += ref;
            total ++;
        }
        divisoes = 0;
        flag ++;    
    }
    // somando mais 2 , por que dois é o unico numero primo par.
    soma +=2;
    total++;
    printf("Soma %d , Total de Primos %d",soma,total);
    return 0;


}

3 个答案:

答案 0 :(得分:1)

9999999999999unsigned int(2 ^ 32 - 1)的最大值大一点。一个简单的解决方法是向所有文字添加ULL后缀,并将unsigned int切换为unsigned long long

答案 1 :(得分:0)

数值数据类型在内存中具有一定量的存储空间,在某个值overflow之后。

你可以把它想象成一辆汽车撞到太多里程后翻滚的里程表。您可以使用更大的data type,它可能会满足您的需求。在某些时候,数字变得足够大,你需要一个任意长度数的库。谷歌搜索'c ++ BigInteger'将为您带来良好的效果。

答案 2 :(得分:0)

int数据类型只能存储(2 ^ 32-1),你的数字大于...... 使用unsigned long可以存储长数字。 。 你也可以使用unsigned float或unsigned double作为大浮点值。