Java 前1000个素数之和
我有下面的程序,我试图找到前1000个素数的和。在代码中,解决方案1和2之间的区别是什么?为什么不将count变量置于if条件之外?如果我把变量放在if之外,我显然得不到我需要的答案,但我不明白为什么它在逻辑上是错误的。这可能是一件简单的事情,但我无法理解。专家们,请帮忙 解决方案1:Java 前1000个素数之和,java,Java,我有下面的程序,我试图找到前1000个素数的和。在代码中,解决方案1和2之间的区别是什么?为什么不将count变量置于if条件之外?如果我把变量放在if之外,我显然得不到我需要的答案,但我不明白为什么它在逻辑上是错误的。这可能是一件简单的事情,但我无法理解。专家们,请帮忙 解决方案1: public class SumOfPrimeNumbers { public static void main(String[] args) { long result = 0; int num
public class SumOfPrimeNumbers {
public static void main(String[] args) {
long result = 0;
int number = 2;
int count = 0;
while (count < 1000) {
if (checkPrime(number) == true) {
result = result + number;
count++;
}
number++;
}
System.out.println("The sum of first 1000 prime numbers is " + result);
}
public static boolean checkPrime(int number) {
for (int i = 2; i < number; i++) {
if (number % i == 0) {
return false;
}
}
return true;
}
primenumbers的公共类{
公共静态void main(字符串[]args){
长结果=0;
整数=2;
整数计数=0;
同时(计数<1000){
if(checkPrime(number)=true){
结果=结果+数字;
计数++;
}
数字++;
}
System.out.println(“前1000个素数之和为”+结果);
}
公共静态布尔校验素数(整数){
for(int i=2;i
}
解决方案2:
public class SumOfPrimeNumbers {
public static void main(String[] args) {
long result = 0;
int number = 2;
int count = 0;
while (count < 1000) {
if(checkPrime(number)==true)
{
result = result + number;
}
count++; //The count variable here has been moved to outside the loop.
number++;
}
System.out.println("The sum of first 1000 prime numbers is "+ result);
}
public static boolean checkPrime(int number) {
for (int i = 2; i < number; i++) {
if (number % i == 0) {
return false;
}
}
return true;
}
公共类素数{
公共静态void main(字符串[]args){
长结果=0;
整数=2;
整数计数=0;
同时(计数<1000){
if(checkPrime(number)=true)
{
结果=结果+数字;
}
count++;//此处的count变量已移动到循环外部。
数字++;
}
System.out.println(“前1000个素数之和为”+结果);
}
公共静态布尔校验素数(整数){
for(int i=2;i
}增加计数的位置非常重要。第一个代码块将前1000个素数相加,而第二个代码块将所有小于1000的素数相加。您不应检查
bool
函数的返回值是否等于true
:此行
if(checkPrime(number)==true)
相当于
if(checkPrime(number))
最后,在if
之外增加计数的解决方案将非素数与素数一起计数,产生明显错误的结果
以下是您应该考虑的“风格”要点:
- 当候选除数大于数字的平方根时,可以停止检查
中的候选除数checkPrime
- 如果您存储到目前为止看到的素数,并且只通过素数列表中的数字来检查整除性,您可以做得更好。当你在寻找前1000个素数时,这几乎不重要,但对于较大的数字,这可能很重要
count
每次通过循环时都会递增,而不管初始测试的结果如何。所以它不是计算素数,而是计算循环中的迭代次数。因此,您将检查1000个连续的数字,而不是连续的素数(这需要通过1000多个数字进行累加)
除了其他人所指出的之外,还可以通过以下方式提高prime检查的效率:
public static boolean checkPrime(int number) {
int s = Math.ceil(Math.sqrt(number));
for (int i = 2; i <= s; i++) {
if ((number % i) == 0) {
return false;
}
}
return true;
}
公共静态布尔校验素数(整数){
ints=Math.ceil(Math.sqrt(number));
对于(int i=2;我考虑重命名<代码>计数>代码> <代码> PrimeCuint < /Calp>或<代码> No.Primes发现< /代码>或类似的东西。我认为您已经混淆了您自己的命名。此外,检查此算法为Funsies:由By,前1000个素数的总和为36829。结果=结果+数目;(数字为2)。@用户2341013你是对的,我认为你的isPrime
为2
返回false
,但它不是。确定。谢谢@dasblinkenlight我不认为这是求素数的有效方法,你最终会检查每个数以确认,最坏的情况是:测试用例很多。我想你的意思是Math、 sqrt
。但是它非常昂贵-您可能只需要计算一次。并且您的函数返回true
用于169
-您可能需要数学。round
和@Dukeling是的,都是真的。谢谢您的关注。