输入一个自然数n,求n!,同时统计结果中有多少个0
请帮忙给出源代码算阶乘的代码自己已经写出
#include<stdio.h>
unsigned long mul(int n);
int main()
{
int m;
puts("Calculate n! n=?\n");
scanf("%d", &m);
printf("%d!=%ld\n", m, mul(m));
getch();
return 0;
}
unsigned long mul(int n)
{
unsigned long p;
if(n>1)
p=n*mul(n-1);
else
p=1L;
return(p);
}
----------------解决方案--------------------------------------------------------
用ltoa将数转化成字符串,然后逐个统计
----------------解决方案--------------------------------------------------------
int main()
{
int n;
int sum=1,i,len,count=0;
char s[128];
printf("input number:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
sum=sum*i;
}
printf("ret:%d\n",sum);
sprintf(s,"%d\0",sum);
for(i=0;i<strlen(s);i++)
{
if(s[i]=='0')
count++;
}
printf("the 0 count:%d\n",count);
}
----------------解决方案--------------------------------------------------------
此题需要知道n的范围
----------------解决方案--------------------------------------------------------
以下是我曾经发的一个精华讲解:
原贴:http://bbs.bc-cn.net/viewthread.php?tid=118295&star=at#
我曾经研究过世界奥林匹克的题,最终发现一个无与伦比的简单解法:
用原数除以5,如100/5=20;
如果得数大于5则将得数再除以5,即20/5=4;
依次类推,直到得数小于4时停止,将以上得数相加
得(20+4)=24,即为解
再举一个例子:
1000/5=200;
200/5=40;
40/5=8;
8/5=1...3;
则1000!末尾有(200+40+8+1)=249.
注意:如果除的过程中发现有余数,则去掉余数,用得数接着算即可,就如8/5=1...3,这里3是没有任何作用的
以上为原创作品,请不要抄袭,转载请告之本人,谢谢!
还有,如果真要求解乘的结果后再"数"零的个数,可以参见我发的
http://bbs.bc-cn.net/viewthread.php?tid=108422&extra=&page=100#
可以解决大数的解乘计算的问题
----------------解决方案--------------------------------------------------------
#include<stdio.h>
#include<conio.c>
long numof5(long n);
int main()
{
long n,k;
while(1){
k=0;
scanf("%d",&n);
for(int i=5;i<=n;i+=5)
{
k+=numof5(i);
}
printf("%d\n",k);
}
}
long numof5(long n)
{
int i=0;
for(;n%5==0;i++)
{
n/=5;
}
return i;
}
----------------解决方案--------------------------------------------------------
长知识了,多谢多谢
----------------解决方案--------------------------------------------------------