// 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个素数,然后就可以了。
答案 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。