nyoj 517 最小公倍数

来源:互联网 发布:网络装备交易 编辑:程序博客网 时间:2024/06/03 02:26

最小公倍数
时间限制: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 1000int 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;}
1 0
原创粉丝点击