欧拉计划问题 - 1 不是 return 我预期的值
Project Euler Problem - 1 does not return the value I expected
我还没有使用 for
学习循环,所以我使用 while
解决了这个问题,但我找不到问题所在,总和应该是 233168 显然,我得到 234168 我根本无法确定我错过了什么。
问题: 如果我们列出所有10以下的自然数是3或5的倍数,我们得到3、5、6和9。这些倍数的总和是 23.
求1000以下所有3或5的倍数的和。
package net.projecteuler;
public class Problem01 {
public static void main(String[] args) {
int n, sum;
boolean notFinished = true;
n = 0;
sum = 0;
while(notFinished) {
if(n % 3 == 0 || n % 5 == 0) {
sum = (sum + n);
}
n = (n + 1);
if(n > 1000) {
notFinished = !true;
}
}
System.out.print("A soma dos números é " + sum);
}
}
你的条件不对。问题陈述是(粗体表示强调):
Find the sum of all the multiples of 3 or 5 below 1000.
而您的程序也对 1000
本身求和,它可以被 5
整除。如果您将条件 n > 1000
更改为 n >= 1000
,您将得到正确答案。
旁注:您真的应该研究 for
循环。这将更适合这一挑战。
你的条件不对。 while 循环运行了太多次,因为您比较的是 n > 1000
而不是 n >= 1000
.
话虽如此,您还可以改进循环。不需要布尔变量,因为您可以直接检查 while 语句中的条件,就像这样 - while (n < 1000)
.
此外,如果您要使用布尔变量,我可能不会通过说 isFinished = !true
将其设置为 false
,而是通过 isFinished = false
或 [=16] =].
您的问题当然与 if
条件有关。应该是n >= 1000
你也可以像这样简化你的算法。您问题的替代解决方案。
public class Main {
public static void main(String[] args) {
System.out.println(sum(1000, 3, 5));
}
private static int sum(int i, int a, int b) {
i = --i;
int c = a * b;
int k1 = i / a;
int k2 = i / b;
int k3 = i / c;
return (k1 * (a + (k1 * a)))/2 + (k2 * (b + (k2 * b)))/2 - (k3 * (c + (k3 * c)))/2;
}
}
请注意,这仅在 a
和 b
是素数时有效。如果a
和b
不是质数,那么c
应该是a
和b
[=22=的LCM
]
int c = lcm(a,b)
我还没有使用 for
学习循环,所以我使用 while
解决了这个问题,但我找不到问题所在,总和应该是 233168 显然,我得到 234168 我根本无法确定我错过了什么。
问题: 如果我们列出所有10以下的自然数是3或5的倍数,我们得到3、5、6和9。这些倍数的总和是 23.
求1000以下所有3或5的倍数的和。
package net.projecteuler;
public class Problem01 {
public static void main(String[] args) {
int n, sum;
boolean notFinished = true;
n = 0;
sum = 0;
while(notFinished) {
if(n % 3 == 0 || n % 5 == 0) {
sum = (sum + n);
}
n = (n + 1);
if(n > 1000) {
notFinished = !true;
}
}
System.out.print("A soma dos números é " + sum);
}
}
你的条件不对。问题陈述是(粗体表示强调):
Find the sum of all the multiples of 3 or 5 below 1000.
而您的程序也对 1000
本身求和,它可以被 5
整除。如果您将条件 n > 1000
更改为 n >= 1000
,您将得到正确答案。
旁注:您真的应该研究 for
循环。这将更适合这一挑战。
你的条件不对。 while 循环运行了太多次,因为您比较的是 n > 1000
而不是 n >= 1000
.
话虽如此,您还可以改进循环。不需要布尔变量,因为您可以直接检查 while 语句中的条件,就像这样 - while (n < 1000)
.
此外,如果您要使用布尔变量,我可能不会通过说 isFinished = !true
将其设置为 false
,而是通过 isFinished = false
或 [=16] =].
您的问题当然与 if
条件有关。应该是n >= 1000
你也可以像这样简化你的算法。您问题的替代解决方案。
public class Main {
public static void main(String[] args) {
System.out.println(sum(1000, 3, 5));
}
private static int sum(int i, int a, int b) {
i = --i;
int c = a * b;
int k1 = i / a;
int k2 = i / b;
int k3 = i / c;
return (k1 * (a + (k1 * a)))/2 + (k2 * (b + (k2 * b)))/2 - (k3 * (c + (k3 * c)))/2;
}
}
请注意,这仅在 a
和 b
是素数时有效。如果a
和b
不是质数,那么c
应该是a
和b
[=22=的LCM
]
int c = lcm(a,b)