您的位置:首页 > 其它

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的数字。

<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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: