【问题标题】:Project Euler Problem - 1 does not return the value I expectedProject Euler Problem - 1 没有返回我期望的值
【发布时间】:2021-09-23 15:02:06
【问题描述】:

我还没有使用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);
    }
}

【问题讨论】:

  • 能分享一下问题定义吗?
  • 当然,抱歉,我忘记了。 projecteuler.net/problem=1
  • 不,在问题的正文中。我们希望我们的问题是独立的。
  • 好了,抱歉。
  • 即使没有问题说明,我也倾向于猜测您有一个错误。预期值和计算值之间的差值为 1000,这显然是在迭代的终点。由于逻辑是结构化的,您的代码将在退出之前使用n == 1000 执行迭代,并且可能不应该这样做。

标签: java loops while-loop


【解决方案1】:

你的条件不对。问题陈述是(粗体表示强调):

求所有1000以下的3或5的倍数之和

而您的程序还对 1000 本身求和,它可以被 5 整除。如果将条件n > 1000 更改为n >= 1000,就会得到正确答案。

旁注:您应该真正研究for 循环。这将更适合这一挑战。

【讨论】:

  • 非常感谢,我很快就会调查for。 :)
【解决方案2】:

你的情况不对。 while 循环运行了太多次,因为您正在比较 n > 1000 而不是 n >= 1000

话虽如此,您还可以改进循环。不需要布尔变量,因为您可以直接检查 while 语句中的条件,例如 - while (n < 1000)

此外,如果您要使用布尔变量,我可能不会通过说isFinished = !true 将其设置为false,而是通过使用isFinished = falseisFinished = !isFinished

【讨论】:

  • 或者只是break
【解决方案3】:

当然,您的问题与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;
    }
}

请注意,这仅在 ab 是质数时有效。如果ab 不是素数,那么c 应该是ab 中的LCMb

int c = lcm(a,b)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 2021-12-11
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多