c语言算100的阶乘 结果又多少个0 程序怎么编译不过

#include<stdio.h>
main()
{
double a=1.0;
int b=1,m=0,i;
for(i=1;i<=100;i++)
{
a=a*b;
b++;
if(a%10==0)
{
a=a/10;
m++;
}
else if(a%10!=0)
break;
}
printf("%d",&m);
}

double 类型不能用 % 运算符,只有 char ,short,int,long 类型能用 % 类型的运算符!!!
因此:
f(a%10==0)
是错的,编译通不过。

另外,这道题目根本不是这么算的!你算法就有问题。100 的阶乘是很大的数,double 类型即使能保存的下, 也会有挺大的误差了。
题的算法是:统计数字 1 ~ 100 中间,因子2 和 因子 5 出现的次数。哪个出现的次数少,设少的出现 n 次,那么最终结果就是 n 个 10。

比如,先简单点的,统计 10 的阶乘,计算结果有多少个 10。
设因子 2 出现次数为 x,因子 5 出现次数为 y。开始 x=y=0。
1 ~ 10 中:
1,1 即不能被 2 整除(没有因子2),也不能被 5 整除(没有因子5);x=y=0。
2,1 能被 2 整除(有因子2),但是不能被 5 整除(没有因子5);x=x+1 = 1, y=0。
3,3 即不能被 2 整除(没有因子2),也不能被 5 整除(没有因子5);x=1,y=0。
4,4 能被 2 整除(有两个因子2),但是不能被 5 整除(没有因子5);x=x+2=3, y=0。
5,x=3,y=y+1 = 1
6,x=x+1=4,y=1
7,x=4,y=1
8,x=x+3=7,y=1
9,x=7,y=1
10,x=x+1=8,y=y+1=2

最终 x=8,y=2,他们中较小的是 2,因此最终的结果中有 2 个零。
实际上 10! = 3628800,结果确实是有 2 个零。

下面是程序:
#include <stdio.h>
int main(int argc, char *argv[])
{
// 计算 n 的阶乘
int n=100;
// x 统计因子 2 出现的次数,y 统计因子 5 出现的次数
int x=0,y=0;
int i,t;
for(i=1; i<=n; i++)
{
t = i;
while(t%2 == 0)
{
x++;
t/=2;
}
while(t%5 == 0)
{
y++;
t/=5;
}
}
printf("%d! has %d zeros at end!\n", n, (x<=y ? x : y));
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-12-14
#include<stdio.h>
#include<math.h>
main()
{ int a=1;
int b=1,i,m=0;
for(i=0;i<100;i++)
{
a=a*b;
b++; }
while(a%10==0)

{
a=a/10;
m++;
}

printf("%d\n",m);
} 不要设置为double %没法运行 这个是i值取12以内运行正确 超过了a溢出没法计算 了 可以考虑优化算法 每次都除以10再乘 如果是10的倍数就反复除以10 不过就算这样也不能保证不溢出

引用另外的一个回答(本问题下的其他回答)
修改一下就好了:
#include <stdio.h>
int main(int argc, char *argv[])
{ // 计算 n 的阶乘 int n=100; // x 统计因子 2 出现的次数,y 统计因子 5 出现的次数
int x=0,y=0;
int i,t;
for(i=1; i<=25; i++)
{
t = i; while(t%2 == 0)
{
x++; t/=2;
} while(t%5 == 0)
{ y++; t/=5; }
}
printf(" has %d zeros at end!\n", (x<=y ? x : y));
return 0;}

100的运行结果是24 因该是对的吧
第2个回答  2012-12-14
%只能对int型变量操作,想要对double型变量取余数,请
include<math.h>
然后a%10用fmod(a,10)代替

并且最后的printf("%d",&m);应该把'&'这个符号去掉

而且你的程序逻辑也错了,怎么能一边乘一边找0呢,应该等100遍乘完之后再找0本回答被提问者采纳
第3个回答  2012-12-14
double a=1.0;

a%10==0

这里明显存在问题,整形才能求模运算

这个问题用double 可能会存在精度损失,建议你看下长整数乘法,那样是不会有问题的
第4个回答  2012-12-14
冗余。。。。
估计不能算100的阶乘会溢出。

#include <stdio.h>

long fac(int n);

void main()
{
int n;
scanf("%d", &n);
while(n >= 0 && n < 14)
{
printf("%d 的阶乘是: %d\n", n, fac(n));
scanf("%d", &n);
}
}

long fac(int n)
{
register long i, f = 1;
for(i = 1; i <= n; i )
{
f *= i;
}
return f;
}