最小公倍数
时间限制: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
题解:简单大数,注意要先处理下;只需要大数相乘就可以了;
代码:#include<cstdio> #include<iostream> #include<cmath> #include<algorithm> #include<cstring> #include<queue> using namespace std; const int INF=0x3f3f3f3f; #define mem(x,y) memset(x,y,sizeof(x)) #define SI(x) scanf("%d",&x) #define PI(x) printf("%d",x) typedef long long LL; int gcd(int a,int b){return b==0?a:gcd(b,a%b);} int ans[110]; int s[110]; int main(){ int n; while(~SI(n)){ int tp=1; s[0]=1; for(int i=1;i<=n;i++){ s[i]=i; for(int j=0;j<i;j++) s[i]=s[i]/gcd(s[j],s[i]); } ans[0]=1; for(int i=1;i<=n;i++){ int temp=0; for(int j=0;j<tp;j++){ temp=ans[j]*s[i]+temp; ans[j]=temp%10; temp/=10; } while(temp){ ans[tp++]=temp%10; temp/=10; } } for(int i=tp-1;i>=0;i--)printf("%d",ans[i]);puts(""); } return 0; }