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

时间:2019-04-12 22:38:35

标签: c# grand-central-dispatch lcm

我正在尝试解决欧拉计划问题#5, “最小的正数能被1到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 个答案:

答案 0 :(得分:1)

不仅仅是素数,还有它们的因式分解。考虑: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

由于您只是想向正确的方向戳,因此我将其编码留给您。 :)

答案 1 :(得分:0)

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {

            bool notfound = true;
            uint num = 0;
            uint primesmultiplied = 2 * 3 * 5 * 7 * 11 * 13 * 17 * 19;
            do
            {

                for(uint i = 20; i > 0; i--)
                {
                    if (num % i == 0)
                    {
                        notfound = false;
                        num += primesmultiplied;
                    }
                    else
                    {
                        notfound = true;
                        break;
                    }
                }

            }
            while (notfound);

            Console.WriteLine(num);
            Console.ReadLine();
        }
    }
}