Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 找到数字1-20的最小公倍数,得到错误答案_C#_Lcm - Fatal编程技术网

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

C# 找到数字1-20的最小公倍数,得到错误答案,c#,lcm,C#,Lcm,我正在努力解决Euler项目的问题#5, “能被1到20之间的所有数字整除的最小正数是多少?” 为了解决这个问题,我创建了使用GCD(最大公因数)查找LCM(最小公倍数)的方法 使用LCM方法我找到第一个和第二个素数的LCM,然后使用该方法的结果找到结果和第三个素数的LCM,等等 static void Main(string[] args) { int listLength = 20; Boolean[] listOfNumbers = new

我正在努力解决Euler项目的问题#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;
    }
static void Main(字符串[]args)
{
int listLength=20;
布尔值[]ListOfNumber=新布尔值[listLength];
ArrayList listOfPrimes=新的ArrayList();
对于(int iii=0;iii
实际答案是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

由于您刚刚要求在正确的方向戳一戳,我将此代码留给您。:)

好的,谢谢你的回复!我知道我对最后一行有点困惑,为什么你忽略2,但不要忽略2*3的3,因为它们都是因素好吧,让我用另一种方式来展示。你的原始因子是2^1,3^1,2^2,5^1,2^1*3^1。我删除了2^1,因为它出现在2^2中。我保留3^1,因为没有其他因子具有更高的3次方。我之所以保留2^2,是因为没有其他因子具有更高的2次方。我保留5^1,因为没有其他因子具有更高的5次方。我删除了2^1*3^1,因为我已经有了2(2^2)的相等或更好的幂和3(3^1)的相等或更好的幂。