nyoj 517 最小公倍数

最小公倍数
时间限制: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;
}

你可能感兴趣的:(nyoj 517 最小公倍数)