我正在尝试解决欧拉计划问题#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
显然,这两个答案都不是正确的答案,我只是想知道我是在正确的轨道上还是弄乱了什么?如果可能的话,只看正确方向的戳戳
答案 0 :(得分:1)
不仅仅是素数,还有它们的因式分解。考虑:2、3、4的LCM是多少?如果仅使用质数,则得到2 * 3 = 6,这显然不是4的倍数。您想要的是2、3、2 * 2的LCM。一旦以这种方式分解了三个数字,就可以可以忽略2,因为显然是2 * 2。
对此进行扩展:
由于您只是想向正确的方向戳,因此我将其编码留给您。 :)
答案 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();
}
}
}