正如标题所解释的,这是一个查找 1 到 20 之间数字 lcm 的程序。我找到了一个算法来做到这一点,这是链接
http://www.cut-the-knot.org/Curriculum/Arithmetic/LCM.shtml
网页上有一个 java 小程序可以更好地解释算法
问题:我编写的代码编译器没有显示错误,但是当我运行代码时程序会发疯,我想可能是一些无限循环,但我一生都无法弄清楚。我使用 turbo c++ 4.5,所以基本上如果有人可以查看代码并帮助我,那就太好了。提前致谢
算法:
假设我们需要找到 2,6,8 的 lcm
首先,我们找到系列中最小的,并将其上方的数字添加到它上面,即系列变为
4,6,8
现在我们再次找到最小值并将列中的初始值添加到它,即 2
6,6,8
所以下一次迭代变成
8,6,8
8,12,8
10,12,8
10,12,16
12,12,16
14,12,16
14,18,16
16,18,16
18,18,16
18,18,24
20,18,24
20,24,24
22,24,24
24,24,24
正如你所看到的那样,所有数字都变得相等,这就是我们的 lcm
#include<iostream.h>
/*function to check if all the elements of an array are equal*/
int equl(int a[20], int n)
{
int i=0;
while(n==1&&i<20)
{
if (a[i]==a[i+1])
n=1;
else
n=0;
i++;
}
return n;
}
/*function to calculate lcm and return that value to main function*/
int lcm()
{
int i,k,j,check=1,a[20],b[20];
/*loading both arrays with numbers from 1 to 20*/
for(i=0;i<20;i++)
{
a[i]=i+1;
b[i]=i+1;
}
check= equl(a,1);
/*actual implementation of the algorith*/
while(check==0)
{
k=a[0]; /*looks for the least value in the array*/
for(i=0;i<20;i++)
{
if(a[i+1]<k)
{
k=a[i+1]; /*find the least value*/
j=i+1; /*mark the position in array */
}
else
continue;
}
a[j]=k+b[j]; /*adding the least value with its corresponding number*/
check= equl(a,1);
}
return (a[0]);
/*at this point all numbers in the array must be same thus any value gives us the lcm*/
}
void main()
{
int l;
l=lcm();
cout<<l;
}