NYOJ 517 最小公倍数

来源:互联网 发布:近期网络热点话题 编辑:程序博客网 时间:2024/05/10 09:35

最小公倍数

时间限制: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。
样例输入
234
样例输出
26

12

思路:就是求出1-n每一个数两两之间化简到不能整除然后再将其相乘,不断地更新。

代码:

#include<stdio.h>#include<cstring>#include<iostream>#include<algorithm>#include<math.h>#include<stdlib.h>#include<stack>#include<vector>#include<string.h>#include<map>#define INF 0x3f3f3f3f3fusing namespace std;int main(){    int a[1001];    for(int i=1;i<=102;i++)    {        a[i]=i;    }//赋值    for(int i=2;i<=102;i++)    {        for(int j=i+1;j<=102;j++)        {            if(a[j]%a[i]==0)//两个数两个数进行对比,如果后一个数可以将后一个数整除就将a[j]=a[j]/a[i];保证两个数所有的数之间没有公因数            {                a[j]/=a[i];            }        }    }    int n;    while(~scanf("%d",&n))    {        int b[1001],ans;        memset(b,0,sizeof(b));//将b初始化        b[0]=1;        for(int i=2;i<=n;i++)        {            int m=0;            for(int j=0;j<1001;j++)//大数相乘            {                ans=b[j]*a[i]+m;                b[j]=ans%10;                m=ans/10;            }        }        int flag;        for(int i=1001-1;i>=0;i--)//倒着输出,去掉前导0        {            if(b[i]!=0)            {                flag=i;                break;            }        }        for(int i=flag;i>=0;i--)        {            printf("%d",b[i]);        }        printf("\n");    }}  


0 0
原创粉丝点击