C# 找到数字1-20的最小公倍数,得到错误答案
我正在努力解决Euler项目的问题#5, “能被1到20之间的所有数字整除的最小正数是多少?” 为了解决这个问题,我创建了使用GCD(最大公因数)查找LCM(最小公倍数)的方法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
使用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)的相等或更好的幂。