寻找数字 1-20 的最小公倍数,得到错误的答案

Finding Least common multiple of numbers 1-20, getting the wrong answer

我正在尝试解决 Project Euler 问题 #5, "What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?"

为了解决这个问题,我创建了使用 GCD(最大公约数)找到 LCM(最小公倍数)的方法
使用 LCM 方法我找到第一个和第二个质数的 LCM,然后使用该方法的结果找到结果和第三个质数的 LCM,等等

    static void Main(string[] args)
    {
        int listLength = 20;
        Boolean[] listOfNumbers = new Boolean[listLength];
        ArrayList listOfPrimes = new ArrayList();

        for (int iii = 0; iii < listLength; iii++)
        {
            listOfNumbers[iii] = true;
        }

        for (int iii = 2; iii < listLength; iii++)
        {
            if (listOfNumbers[iii])
            {
                for (int jjj = iii * 2; jjj < listLength; jjj = jjj + iii)
                {
                    listOfNumbers[jjj] = false;
                }
                listOfPrimes.Add(iii);
            }
        }

        int lcm = 1;
        for (int iii = 0; iii < listOfPrimes.Count; iii++)
        {
            lcm = LCM(lcm, (int)listOfPrimes[iii]);
        }

    }

    static public int GCD(int a, int b)
    {
        int division;
        int modulus;
        if (a < b)
        {
            int c = b;
            b = a;
            a = c;
        }
        division = a / b;
        modulus = a % b;
        if (modulus == 0)
        {
            return b;
        } else
        {
            return GCD(division, modulus);
        }
    }

    static public int LCM(int a, int b)
    {
        int lcm = (a * b) / GCD(a, b);
        return lcm;
    }

实际答案应该是 232792560,但当 LCM 仅使用素数时我得到 22044,而当 LCM 使用所有 20 个数字时我得到 51731680
显然这两个答案都不正确,我只是想知道我是在正确的轨道上还是搞砸了?如果可能的话,只是朝正确的方向看一下

这不仅仅是质数,还有它们的因式分解。考虑:2、3、4 的 LCM 是多少?如果你只使用质数,你会得到 2 * 3 = 6,这显然不是 4 的倍数。你想要的是 2, 3, 2 * 2 的 LCM。一旦你以这种方式分解了三个数字,你可以忽略2,因为它明明是2 * 2的因数。

扩展这个:

  • LCM(2, 3, 4, 5) = LCM(2, 3, 2 * 2, 5) = LCM(3, 2 * 2, 5) = 60
  • LCM(2, 3, 4, 5, 6) = LCM(2, 3, 2 * 2, 5, 2 * 3) = LCM(3, 2 * 2, 5) = 60

既然你只是要求戳对方向,我就把编码留给你了。 :)