1000!值末尾的连续0的个数
记 1000!为S
如果S分解质因数之后 为 (2^a)*(3^b)*(5^c)*……
那么S末尾的连续0的个数 就是 c,也就是1000!里的5的幂的个数
证明很简单
10 =2*5
末尾如果是0,只可能由2*5获得,而1000个数中 含2的因数的数的个数远远大于含5的
例如 5 10 15 25 30 35 都含5因数个数为1
25 50 100 含5因数个数为2
125 250 375 含5因数个数为3
最后把他们加起来就是了
#include
int main()
{
int i,temp;
int count=0;
for(i=5;a<=1000;i+=5)
{
temp = i;
while( temp%5 == 0)
{
count++;
temp = temp/5;
}
}
printf("%d\n",count);
return 0;
}
最简但正确的代码
#include
int main()
{
int n=1000;
int count=0;
while(n)
count+=(int)(n/=5);
printf("%d\n",count);
return 0;
}
1000!值末尾的连续0的个数
记
1000!为S
如果S分解质因数之后
为
(2^a)*(3^b)*(5^c)*……
那么S末尾的连续0的个数
就是
c,也就是1000!里的5的幂的个数
证明很简单
10
=2*5
末尾如果是0,只可能由2*5获得,而1000个数中
含2的因数的数的个数远远大于含5的
例如
5
10
15
25
30
35
都含5因数个数为1
25
50
100
含5因数个数为2
125
250
375
含5因数个数为3
最后把他们加起来就是了
#include
int
main()
{
int
i,temp;
int
count=0;
for(i=5;a<=1000;i+=5)
{
temp
=
i;
while(
temp%5
==
0)
{
count++;
temp
=
temp/5;
}
}
printf("%d\n",count);
return
0;
}
最简但正确的代码
#include
int
main()
{
int
n=1000;
int
count=0;
while(n)
count+=(int)(n/=5);
printf("%d\n",count);
return
0;
}
连续以求10的余数,如果余数是0,则记数,否则退出
假设某值为t
int c=0;
while(!t%10){t/=10;c++;}
1000!阶乘统计时要动态统计了
1*2*3*4*...,见末尾0就除10
但是1000!的值即使去掉末尾的0也太大,除非用一些非常规手段,否则无法运算
______________________________
楼上的解法有道理
竟然有人说无法运算??????
说了吗,最有249个0
看我来:
#include
void main()
{ long a,b=1,nmber=3;
for(a=1;a<1000;a++)
{ b=b*a;
if(b%100==0)
{ nmber=nmber+2;
b=b/100;
}
else
if(b%10==0)
{ nmber++;
b=b/10;
}
b=b%1000;/*因为后面的0是只有与除0以外的最低位相关*/
}
printf("the 0 have:%d",nmber);
getch();
}
先想错了一个地方,现在对了
竟然有人说无法运算??????
说了吗,最有249个0
看我来:
#include
void
main()
{
long
a,b=1,nmber=3;
for(a=1;a<1000;a++)
{
b=b*a;
if(b%100==0)
{
nmber=nmber+2;
b=b/100;
}
else
if(b%10==0)
{
nmber++;
b=b/10;
}
b=b%1000;/*因为后面的0是只有与除0以外的最低位相关*/
}
printf("the
0
have:%d",nmber);
getch();
}
先想错了一个地方,现在对了