题目:计算:在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我们可以得出一个结论就是:我在对明显处数据类型的选取上
是没有问题的,但往往会在不明显的地方选错数据类型
嗯,就这样,有相同问题的读者也注意一下吧