最小公倍数
-
描述
-
为什么1小时有60分钟,而不是100分钟呢?这是历史上的习惯导致。但也并非纯粹的偶然:60是个优秀的数字,它的因子比较多。事实上,它是1至6的每个数字的倍数。即1,2,3,4,5,6都是可以除尽60。我们希望寻找到能除尽1至n的的每个数字的最小整数m.
-
输入
-
多组测试数据(少于500组)。
每行只有一个数n(1<=n<=100).
输出
- 输出相应的m。 样例输入
-
2 3 4
样例输出
-
2 6 12
#include <iostream>
#include <cstring>
using namespace std;const int m=105,Max=1000;
int a[m],b[Max];
int main()
{
for(int i=1;i<m;++i)//下标与对应的数组a中的值相对应
a[i]=i;
for(int i=2;i<m;++i)//求1~n的公倍数,本可直接求n!就好,但要求最小,所以要除去
for(int j=i+1;j<m;++j)//重复的因子。例:n==4,1*2*3*4=24,但是4=2*2,所以,
if(a[j]%a[i]==0) //写成1*2*3*2=12,所以,这块代码是要把重复的因子去掉。
a[j]/=a[i]; //把重复的数字去掉之后剩下的数字连乘就可以了。
int n;
while(cin>>n)
{
memset(b,0,sizeof(b));
b[0]=1;//b数组存最后连乘的结果
int digit=1;//最后乘积的位数,刚开始肯定是一位。
for(int i=2;i<=n;++i)//也可以从1开始。但是1乘以任何数都是1
{
int rem=0;//余数
for(int j=0;j<digit;++j)
{
int result=b[j]*a[i]+rem;//b数组存放的是最后结果。ab*c
b[j]=result%10; //b*c的结果+进位存放于b[j]中又产生新的进位
rem=result/10; //然后a*c的结果+新的进位,
}
while(rem) //处理a*c的结果+新的进位
{
b[digit]=rem%10;
rem/=10;
digit++;
}
}
for(int j=digit-1;j>=0;--j)//由于下标从低到高存放的是个.十.百.千.万....
cout<<b[j]; //所以倒序输出
cout<<endl;
}
return 0;
}