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
话不多说,这道题的测试数据有点弱了,我的方法是简单的最小公倍数求值,而上面的优秀代码是利用1~n中素数因子幂最大的拿出来相乘,不过总的说过来我感觉还是我的比较省时!!
仔细观察会发现,【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中素数因子幂最大的拿出来相乘,不过总的说过来我感觉还是我的比较省时!!
相关文章推荐
- NYOJ 517 最小公倍数 (1-n 个数的最小公倍数,大数)
- nyoj 517 最小公倍数【数学】大数处理
- NYOJ 题目517 最小公倍数(大数)
- NYOJ-517-最小公倍数,大数啊~~~
- nyoj 517 最小公倍数 【java大数】
- NYOJ-517 最小公倍数 TLE 分类: NYOJ 2013-12-29 14:49 253人阅读 评论(0) 收藏
- NYOJ-517 最小公倍数 TLE
- nyoj-517 最小公倍数
- nyoj 517 最小公倍数 【java睑板】
- NYOJ 517 最小公倍数
- [NYOJ 517]最小公倍数
- nyoj517 最小公倍数
- 最小公倍数(nyoj 517)
- NYOJ517 最小公倍数
- nyoj-517 求1-n的最小公倍数
- NYOJ 517 最小公倍数(java实现)
- (NYoj 214)单调递增子序列(二) --非递归思想模板
- NYOJ大数阶乘 南工28
- NYOJ 光棍的yy 斐波那契 大数
- nyoj-655-光棍的yy(大数)