因为任意一个整数n可以表示为n=p1^a1*p2^a2.......所以只需要取每一个素因子数最多的那个ai相乘即可。。。。
2 3 4
2 6 12
#include<stdio.h> #include<string.h> #include<cmath> #include<iostream> #define N 101 using namespace std; int prim[25]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97}; int num[N]; int ans[N]; void doit(int n) {memset(num,0,sizeof(num)); for(int i=2;i<=n;++i) { int p=i; for(int j=0;j<25&&prim[j]*prim[j]<=p&&p!=-1;++j) { int cnt=0; while(p%prim[j]==0) { cnt++; p/=prim[j]; } if(cnt>num[prim[j]]) num[prim[j]]=cnt; } if(p!=1&&num[p]<1) num[p]=1; } } int ceil(int n,int len) { for(int i=0;i<25;++i) { if(num[prim[i]]) { int p=(int)pow((double)prim[i],num[prim[i]]); int carry=0; for(int j=0;j<=len;++j) { ans[j]=ans[j]*p+carry; carry=ans[j]/10; ans[j]=ans[j]%10; if(j==len&&carry!=0) len++; } } } return len; } int main() { int n; while(~scanf("%d",&n)) { memset(ans,0,sizeof(ans)); ans[0]=1; doit(n); int len=ceil(n,0); while(len>=0) printf("%d",ans[len--]); printf("\n"); }return 0; }