最小公倍数
时间限制:1000 ms | 内存限制:65535 KB
难度:3
描述
为什么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
可以发现,1到n的最小公倍数,是1到n-1的最小公倍数乘以n的所有素因子中没有被1到n-1包含的素因子。
例如:1到7的最小公倍数是2*3*2*5*7,8=2*2*2,(8中2出现3次,1到7的素因子中只出现2次)那么1到8就是2*3*2*5*7*2
#include <iostream>
#include <string.h>//memset函数的头文件
using namespace std;
#define M 105
#define MAX 1000
int main() {
int a[M],i,j;
int b[1000];
for(i=1; i<M; i++)
a[i]=i;
/*因为当前数可能是以后数的因子,则把当前数以后的数的因子去掉,剩余的数相乘就好啦*/
for(i=2; i<M; i++) {
for(j=i+1; j<M; j++) {
if(a[j]%a[i]==0) {
a[j]=a[j]/a[i];
}
}
}
int n;
int c;//余数
int s;
while(cin>>n) {
// memset(b,0,1000*sizeof(int));
memset(b,0,sizeof(b));
b[0]=1;
//将b[1]-b[n]中所有数相乘起来就是最小公倍数
for(i=2; i<=n; i++) {
//乘以a[i]
c=0;
for(j=0; j<MAX; j++) {
s=b[j]*a[i]+c;
b[j]=s%10;
c=s/10;
}
}
//输出
for(j=MAX-1; j>=0; j--) //忽略前导0
if(b[j])
break;
for(i=j; i>=0; i--)
cout<<b[i];
cout<<endl;
}
return 0;
}
时间: 2024-10-08 08:38:03