寻找数字 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
既然你只是要求戳对方向,我就把编码留给你了。 :)
我正在尝试解决 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
既然你只是要求戳对方向,我就把编码留给你了。 :)