【发布时间】:2017-07-20 02:06:07
【问题描述】:
*免责声明,当我说“我已经验证这是正确的结果”时,请解释这一点,因为我已经根据 WolframAlpha 的答案检查了我的解决方案,我认为这非常准确。
*目标,求所有小于或等于2,000,000(两百万)的素数之和
*问题,只要我的测试值范围大约小于或等于,我的代码就会输出正确的结果
一旦测试输入大于大约 1,300,000,我就不会输出正确的结果;我的输出将关闭...
测试输入:----199,999 测试输出:---1,709,600,813 正确结果:1,709,600,813
测试输入:----799,999 测试输出:---24,465,663,438 正确结果:24,465,663,438
测试输入:----1,249,999 测试输出:---57,759,511,224 正确结果:57,759,511,224
测试输入:----1,499,999 测试输出:--- 82,075,943,263 正确结果:82,074,443,256
测试输入:----1,999,999 测试输出:--- 142,915,828,925 正确结果:142,913,828,925
测试输入:----49,999,999 测试输出:--- 72,619,598,630,294 正确结果:72,619,548,630,277
*我的代码,发生了什么,为什么它适用于较小的输入?我什至用了 long,而不是 int...
long n = 3;
long i = 2;
long prime = 0;
long sum = 0;
while (n <= 1999999) {
while (i <= Math.sqrt(n)) { // since a number can only be divisible by all
// numbers
// less than or equal to its square roots, we only
// check from i up through n's square root!
if (n % i != 0) { // saves computation time
i += 2; // if there's a remainder, increment i and check again
} else {
i = 3; // i doesn't need to go back to 2, because n+=2 means we'll
// only ever be checking odd numbers
n += 2; // makes it so we only check odd numbers
}
} // if there's not a remainder before i = n (meaning all numbers from 0
// to n were relatively prime) then move on
prime = n; // set the current prime to what that number n was
sum = sum + prime;
i = 3; // re-initialize i to 3
n += 2; // increment n by 2 so that we can check the next odd number
}
System.out.println(sum+2); // adding 2 because we skip it at beginning
请帮忙:)
【问题讨论】:
-
作为一个实验,您是否尝试过使用 java 的 BigInteger 类?
-
@mba12 我还没有……我正在上大学的编程入门课,我试图仅将我在课堂上学到的知识结合起来,回答欧拉项目的问题...
-
另一个想法...您正在接近并超过 int max_value。通常,当您将 int 和 long 混合在一起时,int 会被转换为 long。但是在某些情况下,long 可以向下转换为 int。所以为了安全起见,你可能想在你的整数常量后面加上一个字母“L”。看看是否有帮助。见:stackoverflow.com/questions/3073862/java-arithmetic-int-vs-long
-
问题不在于溢出。如果你得到的最高值是 142,913,828,925 这样的数字,那正好在
longs 的范围内,其中最高的是 9,223,372,036,854,775,807。 -
提示:打印小限制的素数,例如小于 10 的所有素数之和...