c语言编程:100的阶乘有多少个零
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
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, (x<=y ? x : y));
return 0;
}
// 注释比较多,希望你不要感到厌烦,呵呵。
// 还记得10进制的乘法么?
// 567
// * 5
// -------
// 2835
// 用编程语言表示出来就是
// 当前的int a[4] ={0, 5, 6, 7}
// 然后从最低位开始用5去乘以每一位,少于10的部分就是这
// 个位新的值超过10的部分就是进位,加入他的前一位的结果
// 那么从最低位开始a[0]*5=35,由于没有进位所以a[0]=5, carry
// =3,a[1]*5=30,加上进位3=33,所以a[1] =3, carry=3,以此类推最
// 高位就是a[3] =2;所以我们的到的数组就是a[4] ={2,8,3,5},结果
// 当然就是2835拉。
// 下面我们只是用更大的进制模仿这个过程,XD
#include
#define SIZE 500 // SIZE 500就可以表示结果在500*6=3000位以内的大整数
#define BASE 1000000 // 目前使用进制的基数,6位的底数可以处理1000以内的阶乘
// 超过1000的话会溢出,因为最大的六位数
//乘以4位数可能超过32位整数的范围
// 当处理大一点的阶乘的话就要相应减小这个值
// 所以当你求1千万的阶乘的时候记得base是10,呵呵。
unsigned int a[SIZE];
void jiechen(int n)
{
int i, j;
int carry; //进位
int max =0; //最高位,当前数即表示占了数组的max+1项
a[0] = 1; //最低位初始化成1
for(i=1; i<=n; i++) {
carry =0; //每让这个超大的数乘一个新的数字时,进位初始化成0
for(j=0; j<=max; j++) { // 处理每一位
a[j] = a[j]*i +carry;
carry = a[j] / BASE; //超出10000000作为高位的进位 a[j] = a[j] % BASE; //当前位是当前位乘以*i+低位的进位
}
if(carry != 0) //最高位有进位就调整当前最高位
a[++max] = carry;
}
printf("%d!=", n); //以下是打印过程
printf("%d", a[max]); //最高位我们不打印前面的0,不然看起来不爽XD
for(i=max-1; i>=0; i--) //注意:是从高位开始打印的
printf("%06d", a[i]); //打印6位,注意要包括前面的0,还有修改了BASE的话记得改这里!
printf("
");
}
int main()
{
for(int i=1; i<100; i++) //打印100以内的阶乘来验证我们的成果
jiechen(i);
return 0;
}
#include <string.h>
typedef struct num
{
int data[10000];
int len;
} NUM;
void jc(NUM* sj, int n)
{
int i = 0, j = 0, temp = 0, inc = 0;
int len = 0;
memset(sj, 0, sizeof(NUM));
sj->data[0] = 1;
for (i=1;i<=n;i++)
{
for (j=0;j<=len;j++)
{
temp = sj->data[j]*i + inc;
sj->data[j] = temp%100000;
inc = temp/100000;
}
if (inc)
len++, sj->data[j] = inc, inc = 0;
}
sj->len = len;
}
/*算法1*/
int countzero_1(NUM*sj)
{
int i = 0, k ,n;
while (sj->data[i]==0)
i++;
n = sj->data[i];
k = 0;
while (n%10==0)
n/=10,k++;
return i * 5 + k;
}
/*算法2*/
int countzero_2(int st,int dt)
{
int count=0 ;
int i ;
for(i=st;i<=dt;++i)
{
int temp=i ;
while(temp%5==0)
{
++count ;
temp/=5 ;
}
}
return count ;
}
int main()
{
NUM rst;
jc(&rst,100);
printf("%d\n", countzero_1(&rst));
printf("%d\n", countzero_2(1,100));
return 0;
} ----------物联网校企联盟技术部
最后面有多少个零,这个可以弄出来
计算5 10的个数,但是中间的零不好说
要是真的统计的话,需要把这个数算出来
算法就是大数的乘法,这个参考大数的加分,连加算出来
也不是很多
那就是1乘到100吗 那不就是10个零吗 被10整除不就行了
单片机C51编程(C语言):1到100的求和显示,在数码管里显示出来.
);display();delay();num++;if(num==100)num=0;} } void convert(){ sw=num\/10;gw=num%10;} void display(){ P1=Led[gw];P2=Led[sw];} void delay(){ uchar i,j,k;for(k=0;k<2;k++)for(i=0;i<250;i++)for(j=0;j<250;j++);} 使用仿真软件电路连接如下图 ...
用c语言怎么求1到100的和?
include"stdio.h"intmain(){ doublesum=0;\/\/用double的目的是提高精度 doubleitem=0;inti;for(i=1;i<=99;i+=2)\/\/步长2,各项头数是相接的,{ item=i*(i+1)*(i+2)*1.0;sum+=item;} printf("1*2*3+3*4*5+...+99*100*101=%.0lf\\n",sum);return0;} ...
C语言编程 从1到100分别用for while do while表达
for(int i=0;i<=100;i++){ System.out.println(i);} int i=0;while(i++<=100){ System.out.println(i);} int i = 0;do { System.out.println(i);} while (i++ < 100);
C语言编程序,求100以内能被8整除的数,并求出它们的和。
以下是一个求解 100 以内能被 8 整除的数,并求它们的和的程序示例:```c include <stdio.h> int main() { int sum = 0;printf("100以内能被8整除的数有:");for(int i = 1; i <= 100; i++) { if(i % 8 == 0) { printf("%d ", i);sum += i;} } printf("它们的...
求1到100之和用C语言怎么编程
include <stdio.h> int main(){ int a,b;b=0;for(a=1;a<=100;a+=1)b=b+a;printf("sum = %d\\n",b);return 0;}
用c语言编程,要求输入1到100之间的数字,当输错时提示输入错误请重新输入...
include<stdio.h> int main(){ int i;scanf("%d",&i);do{ if(i>=1&&i<=100) break;else{ printf("输入错误, 请重新输入。\\n");fflush(stdin);scanf("%d",&i);} }while(1);printf("您输入的是: %d\\n",i);return 0;} ...
C语言编程实现从1到100的求 和
在C语言中可以通过定义一个累加器(一个变量)并结合for循环来实现计算1到100之和。具体的实现程序如下:double sum=0; \/\/ 定义累加器变量sum,并初始化为0 int i;for(i=1; i<=100; i++){ sum += i; \/\/ 等价于sum = sum + i; 即将累加的和保存在累加器sum中 } printf("%lf...
C语言编程:用筛选法求100之内的素数,
C语言编程:用筛选法求100之内的素数, #include<stdio.h>#include<math.h>voidmain(){inti,t,m;for(m=1;m<=100;m=m+2){t=sqrt(m);for(i=2;i<=t;i++)if(m%i==0)break;if(i>t)printf("%disaprimenumber.\\n",m);elseprintf("%... #include <stdio.h>#include <math.h>void main(...
C语言编程问题:输出100以内个位数为6且能被3整除的所有数。
输出100以内个位数为6且能被3整除的所有数的源代码如下:include<stdio.h> int main(){ int i;for(i=1;i<100;i++){ if(i%10 == 6 && i%3 == 0)printf(" %d ",i);} return 0;}
用C语言编程输出1-100的整数间十位数和个位数之和不等于3的数,怎么写...
代码文本:include "stdio.h"int main(int argc,char *argv[]){ int n,k;for(k=0,n=1;n<22;n++)if(n%10+n\/10!=3)printf(++k%10 ? "%4d" : "%4d\\n",n);while(n<=100)printf(++k%10 ? "%4d" : "%4d\\n",n++);putchar('\\n');return 0;} ...
丛枝前列: 以C语言的数据类型来求100的阶乘不造成数据过大溢出是不现实的,所以不能在求得100的阶乘之后再数它末尾有多少个0,只能在累乘的过程中遇到一个0就干掉,最后数总共干掉了多少个,至于由于溢出前面丢掉了多少位的数就管不了了,代...
永顺县19325584477: c语言编程:100的阶乘有多少个零 - ?
丛枝前列: 最后面有多少个零,这个可以弄出来 计算5 10的个数,但是中间的零不好说要是真的统计的话,需要把这个数算出来 算法就是大数的乘法,这个参考大数的加分,连加算出来 也不是很多
永顺县19325584477: 100的阶乘后面有几个0? - ?
丛枝前列: 0是怎么来的,1),本来就是0;2),5*2=10. 统计0的个数,从1-100,10,20,....总共11个0 统计5的个数,从5-95,10个 所以100的阶乘是21个0.
永顺县19325584477: 100的阶乘末尾有多少个零?急! - ?
丛枝前列: 考虑因数5的个数,5的倍数20个,25的倍数4个 20+4=24个
永顺县19325584477: 100的阶乘末尾有几个0? - ?
丛枝前列:[答案] 仔细算了一下,应该24个才对.大家都会想到试着乘一下,一般遇到末尾2和5的组合就能出0,这样可以分为10组吧,算上整十的每组至少出2个0,这样结果至少20个0.现在只剩下考虑一些特殊情况,后来我发现只有四种特殊情况,分别...
永顺县19325584477: 100的阶乘末位有几个零 - ?
丛枝前列: 100÷5=20100÷25=420+4=24100的阶乘末位有24个零
永顺县19325584477: 100的阶乘末位有几个零 - ?
丛枝前列:[答案] 100÷5=20 100÷25=4 20+4=24 100的阶乘末位有24个零
永顺县19325584477: c语言算100的阶乘 结果又多少个0 程序怎么编译不过 - ?
丛枝前列: double 类型不能用 % 运算符,只有 char ,short,int,long 类型能用 % 类型的运算符!!!因此:f(a%10==0) 是错的,编译通不过.另外,这道题目根本不是这么算的!你算法就有问题.100 的阶乘是很大的数,double 类型即使能保存的下, 也会...
永顺县19325584477: 100的阶乘有多少个0 - ?
丛枝前列: 100的阶乘有24个0
永顺县19325584477: 100的阶乘末尾有多少个零!急求程序!?
丛枝前列: #include <stdio.h> int main() { double i,sum=1; for(i=1;i<=100;i++) { sum=sum*i; } printf("%e",sum); scanf("%d"); } 结果是9.332622e+157