UVA - 568 Just the Facts
2014-12-18 16:01
288 查看
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19089
求n的阶乘从后往前的非0位。
我是直接用万进位法,把n的阶乘求出来,再去找那个非0的数字。
大神解法,省时很多。
从2到n,每次更新digit,都先求出该数的2和5的个数,每对2和5相互抵消,每次计算都对10取模,减小计算量。显然2的个数一定比5的个数多。
求n的阶乘从后往前的非0位。
我是直接用万进位法,把n的阶乘求出来,再去找那个非0的数字。
<span style="font-family:SimSun;font-size:14px;">#include<cstdio> #include<cstring> int f[10000]; int main() { //freopen("a.txt","r",stdin); int n,i,j,p,a,c; while(~scanf("%d",&n)) { p=1; memset(f,0,sizeof(f)); f[0]=1; for(i=2;i<=n;i++) { c=0; for(j=0;j<p;j++) { f[j]=f[j]*i+c; c=f[j]/10000; f[j]=f[j]%10000; } if(c) { p++; f[p-1]+=c; } } for(i=0;i<p;i++) { if(f[i]!=0) break; } while(f[i]>0) { a=f[i]%10; if(a>0) break; f[i]/=10; } printf("%5d -> %d\n",n,a); } return 0; } </span>
大神解法,省时很多。
从2到n,每次更新digit,都先求出该数的2和5的个数,每对2和5相互抵消,每次计算都对10取模,减小计算量。显然2的个数一定比5的个数多。
#include<cstdio> int main() { int n,sum,n2,n5,i,j; while(~scanf("%d",&n)) { sum=1; n2=n5=0; for(i=2;i<=n;i++) { j=i; while(j%2==0) { n2++; j/=2; } while(j%5==0) { n5++; j/=5; } sum=(sum*j)%10; } for(i=0;i<n2-n5;i++) sum=(sum*2)%10; printf("%5d -> %d\n",n,sum); } return 0; }
相关文章推荐
- UVa 568 - Just the Facts
- Uva 568 - Just the Facts
- UVA - 568 Just the Facts
- UVa 568 - Just the Facts
- UVa 568 Just the Facts
- uva 568 - Just the Facts
- Uva 568 - Just the Facts
- uva568 Just the Facts
- UVA 568 - Just the Facts(数论)
- UVA 568 Just the Facts
- UVa 568 - Just the Facts
- UVa 568 - Just the Facts
- UVA 568 (暑假-数论 -C - Just the Facts)
- uva 568 just the facts
- UVA 568 Just the Facts (水)
- UVA 568 - Just the Facts
- uva 568 - Just the Facts
- UVA - 568 Just the Facts
- UVA-568 Just the Facts
- uva 568 just the facts