想不出更好的方法,为什么测试的时候总是超时?
谁有改进的方法,谢谢!
#include<stdio.h>
int ct;
/*inline void fac(int n){
ct=0;
if(n<5)return;
for(int i=5,j=5;i<=n;i+=5,j=i)
while(j%5==0)
{j/=5;ct++; } */
int main(){
int count;
scanf("%i",&count);
//int* a=new int[count];
for(int k=0;k<count;k++){
ct=0;
int n;
scanf("%i",&n);
if(n<5)ct=0;
for(int i=5,j=5;i<=n;i+=5,j=i)
while(j%5==0)
{j/=5;ct++; }
printf("%i\n",ct);}
printf("\n");
return 0;}
这个程序的结果是计算<=n的所有数含有的因子5的总数目。
在我的机器上跑了没问题。
循环是不是可以改成这样:
for(int i=5;i<=n;i+=5)
{
int j = i;
while(j%5==0)
{j/=5;ct++; }
}
我写得如何:
ct = 0;
while ( n/=5)
ct += n;
应该没问题吧。
计算每个数据的阶乘的尾部有多少个0:
我猜,N! 的末尾的零的个数有:
N / 5 + N / 25 + N / 125 + N / 625 + N / 3125 + N / 5^i + ...
只要取前 log(N) / log(5) 项即可
看看这个对不对:
int nzero(int n)
{ // 计算n的阶乘的尾部有多少个0
int z = 0;
for (int i = 5; i <= n; i *= 5)
z += n / i;
return z;
}