比如N=10
小于10的质数有2,3,5,7
对应的最大幂是:3,2,1,1
则最小公倍数是:2^3x3^2x5^1x7^1 = 2520
#include <math.h>
#include <stdio.h>
#include <string.h>
const int M = 120;
bool not_prime[M];
int prime[30], point[30];
struct Ac
{
int num[50];
int len;
}ans;
void ac_table()
{
int top = -1;
for(int i=2;i<M;i++)
if(not_prime[i] == false)
{
prime[++top]=i;
for(int j=2*i;j<M;j+=i)
not_prime[j] = true;
}
}
void Init()
{
memset(point,0,sizeof(point));
memset(ans.num,0,sizeof(ans.num));
ans.num[0] = 1;
ans.len = 0;
}
void my_pow(Ac &c,int x)
{
for(int i=0;i<=c.len;i++)
c.num[i] *= x;
for(int i=0;i<=c.len;i++)
if(c.num[i] >= 10000)
{
c.num[i+1] += c.num[i]/10000;
c.num[i] = c.num[i]%10000;
}
c.len = c.num[c.len+1]==0 ? c.len : c.len+1;
}
void Print(Ac &c)
{
for(int i=c.len;i>=0;i--)
printf(i==c.len? "%d" : "%04d",c.num[i]);
printf("\n");
}
void divide(int x)
{
for(int i=0;prime[i]<=x;i++)
{
int tmp = 0;
while(x%prime[i]==0)
{
tmp++;
x /= prime[i];
}
if(tmp > point[i])
{
my_pow(ans,pow(prime[i] ,tmp - point[i]));
point[i] = tmp;
}
}
}
int main()
{
int n;
ac_table();
while(~scanf("%d",&n))
{
Init();
for(int i=2;i<=n;i++)
divide(i);
Print(ans);
}
return 0;
}