您的位置:首页 > 其它

NYOJ 517 最小公倍数 (大数+求最小公倍数思想)

2012-08-10 19:46 399 查看
考虑到1-100的最小公倍数肯定超出__int64.所以需要转化成字符串问题来解

仔细观察会发现,【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<stdio.h>
#include<string.h>
#define N 50
int len,a
={1};
char tab[100][45]={0,1};
inline int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int mod(int t) //求余
{
int i,k;
for(k=0,i=len-1;i>=0;--i){
k=(k*10+a[i])%t;
}
return k;
}
void fun(int m,int n)  //乘以m再除以n
{
int i,j,k,c;
int s
;
for(c=i=0;i<len+2;++i){
k=a[i]*m+c;
a[i]=k%10;
c=k/10;
}
for(i=len+1;i>=0&&!a[i];--i);
len=i+1;
for(k=j=0,i=len-1;i>=0;--i){
k=k*10+a[i];
s[j++]=k/n;
k%=n;
}
len=j;
memset(a,0,sizeof(a));
for(i=0;i<len;++i)
a[i]=s[len-i-1];
for(i=len;!a[i];--i);
len=i+1;
}
int main()
{
int i,j,k,t,n;
for(len=1,i=2;i<=100;++i){//打表
t=mod(i);
if(t){
k=gcd(i,t);
fun(i,k);
}
for(tab[i-1][0]=j=len-1;j>=0;--j)
tab[i-1][j+1]=a[j];
}
while(~scanf("%d",&n)){
for(j=tab[n-1][0]+1;j>0;--j)
printf("%d",tab[n-1][j]);
printf("\n");
}
return 0;
}


//优秀代码:
#include <stdio.h>
int a,i,j,l;
void prime(int pri[])
{
for(i=2;i<=100;i++)
if(!pri[i])
for(j=i+i;j<=100;j+=i)
pri[j]=1;
}
void bingo(int ans[][45],int pri[])
{
for(a=3;a<=100;a++)  //打表
{
ans[a][0]=1;
for(i=2;i<=a;i++)
{
if(!pri[i])
{
j=i;
while(j<=a)
{
j*=i;
int temp=0;
for(l=0;l<50;l++)
{
int p=ans[a][l]*i+temp;
ans[a][l]=p%10;
temp=p/10;
}
}
}
}
}
}
int main()
{
int pri[100]={1,1,0},ans[101][45]={0};
prime(pri);
bingo(ans,pri);
while(scanf("%d",&a)!=EOF)
{
if(a==1||a==2)
printf("%d\n",a);
else
{
for(i=44;i>=0;i--)
if(ans[a][i]) break;
for(j=i;j>=0;j--)
printf("%d",ans[a][j]);
printf("\n");
}
}
return 0;
}


话不多说,这道题的测试数据有点弱了,我的方法是简单的最小公倍数求值,而上面的优秀代码是利用1~n中素数因子幂最大的拿出来相乘,不过总的说过来我感觉还是我的比较省时!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: