项目euler 10帮助。这段代码有什么问题?总和翻转为负数

时间:2014-07-31 13:33:01

标签: java sum primes negative-number

// finding sum of all primes under 2 million
public class lll {

    public static void main(String[] args) {
        int a = 2;
        int b = 0;
        int c = 0;
        while (a < 2000000) {
            int i = 1;
            for (i = 1; i * i <= a; i++) {
                if (a % i == 0)
                //if factor is found of number a b goes up 1
                {
                    b++;
                }
            }
            // all primes have only one factor <= sqrt   (1)
            if (b == 1)
            // if b =1 , a is prime so c+=a
            {
                c += a;
            }
            //reset b and add one to a to move on 
            b = 0;
            a++;
            // for error checking see description 
            System.out.println(c);

        }
        System.out.println(c);
    }
}

我试图制作一个代码来找到200万以下所有素数的总和,这是我给它的1179908154,但这不对,c应该是总和。在每次检查数字为素数后我尝试获得c,它表明在运行此代码期间,它从正面变为负面,然后再次返回。从1开始没有任何意义,从0开始上升c,它上升了一个因此c变得负面(a永远不会消极),请帮助我,我设法使用这种素数检查的方法来正确地获得了第10001个素数,然后就可以了。

3 个答案:

答案 0 :(得分:1)

32位整数只能保存低于约20亿的数字。如果您尝试向该数字添加更多内容(可通过Integer.MAX_VALUE访问),您最终将会翻转&#34;翻转&#34;到负数。试试下面的代码:

    System.out.println(Integer.MAX_VALUE);
    System.out.println(Integer.MAX_VALUE + 1);
    System.out.println(Integer.MIN_VALUE);

所以你的问题是整数不够大!你怎么解决这个问题?最简单的方法是使用long而不是int。假设,如果long甚至不够大,该怎么办?然后你可以使用像BigInteger这样的类,它不会被限制为固定的位数,并且可以根据需要增长。

答案 1 :(得分:0)

好吧,你把c声明为一个int,在java中它的最大值是2,147,483,647。所有素数不到100万的总和是37,550,402,023,所以我认为你超过了int的数据存储,这就是为什么它对你不利。

答案 2 :(得分:0)

我的猜测是它与记忆有关。在java中,整数可以容纳的最大数是2147483647.因此,如果素数之和超过这个数,它将循环回-2147483648并继续计数。试着改变你的变量c。