题目:计算:在0!, 1!, 2!, 3!, ..., (n-1)!, n!这些数中,有多少个数末尾有偶数个0。
Input
输入文件包含多组测试数据,并以“-1”结束。
每组数据只有一行,包含一个正整数n。
Output
对于每个测试数据,输出一行表示答案。
就这样,
我的错误代码:
#include<stdio.h>
typedef
long
long
lint;
lint n,ans,i,cnt;
lint dfs(lint len,lint y,lint z)
{
if
(len==0||y==0)
return
len;
// if(y==1)return (len/10+len%10)*5+len%5;
lint k1,k2,res=0;
if
(y%2==1)
{
k1=dfs(z,y-1,z/5);
k2=z-k1;
res=((
int
)len/(2*z))*(k1+k2);
if
((len%(2*z))>=z)
{
res+=k1;
res+=len%z-dfs(len%z,y-1,z/5);
}
else
res+=dfs(len%z,y-1,z/5);
}
else
{
k1=dfs(z,y-1,z/5);
res=((
int
)len/z)*k1;
res+=dfs(len%z,y-1,z/5);
}
return
res;
}
int
main()
{
while
(~
scanf
(
"%lld"
,&n))
{
if
(n==-1)
return
0;
cnt=1;i=1;
while
(n/(i*5))
{
i*=5;
cnt++;
}
ans=dfs(n+1,cnt-1,i);
// =((n/10)+(n/5)%2)*5+(n-(int(n)/5)*5+1);
printf
(
"%lld\n"
,ans);
}
}
|
好,开始找不同:
#include<stdio.h>
typedef
long
long
lint;
lint n,ans,i,cnt;
lint dfs(lint len,lint y,lint z)
{
if
(len==0||y==0)
return
len;
// if(y==1)return (len/10+len%10)*5+len%5;
lint k1,k2,res=0;
if
(y%2==1)
{
k1=dfs(z,y-1,z/5);
k2=z-k1;
res=((lint)len/(2*z))*(k1+k2);
if
((len%(2*z))>=z)
{
res+=k1;
res+=len%z-dfs(len%z,y-1,z/5);
}
else
res+=dfs(len%z,y-1,z/5);
}
else
{
k1=dfs(z,y-1,z/5);
res=((lint)len/z)*k1;
res+=dfs(len%z,y-1,z/5);
}
return
res;
}
int
main()
{
// freopen("in.txt","r",stdin);
while
(~
scanf
(
"%lld"
,&n))
{
if
(n==-1)
return
0;
cnt=1;i=1;
while
(n/(i*5))
{
i*=5;
cnt++;
}
ans=dfs(n+1,cnt-1,i);
// =((n/10)+(n/5)%2)*5+(n-(int(n)/5)*5+1);
printf
(
"%lld\n"
,ans);
}
}
|
so我们可以得出一个结论就是:我在对明显处数据类型的选取上
是没有问题的,但往往会在不明显的地方选错数据类型
嗯,就这样,有相同问题的读者也注意一下吧