输入一个自然数n,求n!,同时统计结果中有多少个0。

作者&投稿:范备 (若有异议请与网页底部的电邮联系)
c语言问题 输入一个自然数 n 求n!,同时统计结果中有多少个0~

不用开新问题了,我已经把原回答修改了,改成你要的字符串运算。
但即使这样,n也不要太大,看我测试数据就知道了。
代码原理:n!就是循环累计乘法,多位数字符串与多位数字符串相乘和人算法一样,就是其中一个字符串每一位数字和另一个字符串数字相乘,同时所有乘积移位累加。
注意:我写的所有字符串运算函数,没有写字符串验证,如果你想单独把函数拿出来用,记得写个输入验证,不要把非数字的字符串传进去。


#include #include #include #include void meError(void *p);//内存申请失败char *addByStr(char *str1,char *str2);char *inversion(char *str);//倒置字符串char *multByStr1(char *str1,char c2);//多位数字符串与单位数字符串相乘char *multByStr2(char *str1,char *str2);//多位数字符串相乘char *p10ByStr(char *str,int n);//字符串数字乘n个10char *num2Str(int n);//数字转字符串int main(){ int n,i,len,cnt=0; char *nStr=NULL; while(1) { nStr=(char *)malloc(sizeof(char)*2); meError(nStr); nStr[0]='1',nStr[1]=0; printf("输入一个自然数n,求n!
"); scanf("%d",&n); for(i=1;i=0;i--) if(nStr[i]=='0') cnt++; printf("结果包含%d个0

",cnt); free(nStr); nStr=NULL; } return 0;}char *num2Str(int n)//数字转字符串{ int i=0,len=1; char *str=NULL,*strSave=NULL; while(n) { if(str==NULL) { str=(char *)malloc(sizeof(char)*2); meError(str); } else { strSave=(char *)realloc(str,sizeof(char)*(len+1)); meError(strSave); str=strSave; strSave=NULL; } str[i]=n%10+'0'; str[i+1]=0; i++; len++; n=n/10; } inversion(str); return str;}char *p10ByStr(char *str,int n)//字符串数字乘n个10,注意:str必须是动态申请内存!!{ int len=strlen(str),i; char *p=NULL,*strSave=NULL; if(n>0) { strSave=realloc(str,sizeof(char)*(len+1+n)); meError(strSave); str=strSave; p=&str[len]; for(i=0;i=0;i--) { c2=str2[i]; addStrs[j++]=multByStr1(str1,c2);//这里addStrs存储的是str1和str2每一位的乘积 } //--------sum0和sum1交替,为了及时释放内存------- sum0=(char *)malloc(sizeof(char)*2); meError(sum0); sum0[0]='0',sum0[1]=0;; for(i=0;i0) *p=c+'0'; break; } i--; } inversion(mulStr); return mulStr;}char *addByStr(char *str1,char *str2){ int len1=strlen(str1),len2=strlen(str2),maxSize,i=len1-1,j=len2-1,a,b,c=0; char *addStr=NULL,*p=NULL; if(len1>len2)//多留两位,一位给结束符号,一位给进位 maxSize=len1+2; else maxSize=len2+2; addStr=(char *)malloc(sizeof(char)*maxSize); meError(addStr); memset(addStr,0,sizeof(char)*maxSize); p=addStr; while(1) { if(i0) *p=c+'0'; break; } i--; j--; } //--------------数组倒置------------------ inversion(addStr); return addStr;}char *inversion(char *str)//倒置字符串{ char *p=str,*pd=&str[strlen(str)-1],cs; while(p<pd) { cs=*p; *p=*pd; *pd=cs; p++; pd--; } return str;}void meError(void *p)//内存申请失败{ if(p==NULL) { printf("
异常:内存申请失败!回车结束程序!
"); while(getch()!=''); exit(0); }}

#include
#include
void
main()
{
int
n,i=0;
long
int
sn=1,t;
printf("请输入n的值:");
scanf("%d
",&n);
for(i=1;i<=n;i++)
sn=sn*i;
t=sn;
while(sn!=0)
{
sn=sn/5;
i++;//累计0的个数
}
printf("%d的阶乘结果为
",t);
printf("结果中0的个数为:%d",i);
}
用的是n!=1*2*3*4*5*6*7*8*9*10*11……=1*2*3*(2*2)*5*(2*3)*7*(2*2*2)*(3*3)*(2*5)*11……
后面的式子中有几个5就有
就会得到几个末位0的原理

不用开新问题了,我已经把原回答修改了,改成你要的字符串运算。

但即使这样,n也不要太大,看我测试数据就知道了。

代码原理:n!就是循环累计乘法,多位数字符串与多位数字符串相乘和人算法一样,就是其中一个字符串每一位数字和另一个字符串数字相乘,同时所有乘积移位累加。

注意:我写的所有字符串运算函数,没有写字符串验证,如果你想单独把函数拿出来用,记得写个输入验证,不要把非数字的字符串传进去。

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <conio.h>
void meError(void *p);//内存申请失败
char *addByStr(char *str1,char *str2);
char *inversion(char *str);//倒置字符串
char *multByStr1(char *str1,char c2);//多位数字符串与单位数字符串相乘
char *multByStr2(char *str1,char *str2);//多位数字符串相乘
char *p10ByStr(char *str,int n);//字符串数字乘n个10
char *num2Str(int n);//数字转字符串
int main()
{
    int n,i,len,cnt=0;
    char *nStr=NULL;
    while(1)
    {
        nStr=(char *)malloc(sizeof(char)*2);
        meError(nStr);
        nStr[0]='1',nStr[1]=0;
        printf("输入一个自然数n,求n!
");
        scanf("%d",&n);
        for(i=1;i<=n;i++)
            nStr=multByStr2(nStr,num2Str(i));
        printf("计算结果:%s
",nStr);
        len=strlen(nStr);
        for(i=len-1;i>=0;i--)
            if(nStr[i]=='0')
                cnt++;
        printf("结果包含%d个0

",cnt);
        free(nStr);
        nStr=NULL;
    }
    return 0;
}
char *num2Str(int n)//数字转字符串
{
    int i=0,len=1;
    char *str=NULL,*strSave=NULL;
    while(n)
    {
        if(str==NULL)
        {
            str=(char *)malloc(sizeof(char)*2);
            meError(str);
        }
        else
        {
            strSave=(char *)realloc(str,sizeof(char)*(len+1));
            meError(strSave);
            str=strSave;
            strSave=NULL;
        }
        str[i]=n%10+'0';
        str[i+1]=0;
        i++;
        len++;
        n=n/10;
    }
    inversion(str);
    return str;
}
char *p10ByStr(char *str,int n)//字符串数字乘n个10,注意:str必须是动态申请内存!!
{
    int len=strlen(str),i;
    char *p=NULL,*strSave=NULL;
    if(n>0)
    {
        strSave=realloc(str,sizeof(char)*(len+1+n));
        meError(strSave);
        str=strSave;
        p=&str[len];
        for(i=0;i<n;i++)
            *p='0',p++;
        *p=0;
    }
    return str;
}
char *multByStr2(char *str1,char *str2)//多位数字符串相乘
{
    int len2=strlen(str2),i,j=0;
    char **addStrs=(char **)malloc(sizeof(char *)*len2),*sum0=NULL,*sum1=NULL,*sum=NULL,c2;
    meError(addStrs);
    for(i=len2-1;i>=0;i--)
    {
        c2=str2[i];
        addStrs[j++]=multByStr1(str1,c2);//这里addStrs存储的是str1和str2每一位的乘积
    }
    //--------sum0和sum1交替,为了及时释放内存-------
    sum0=(char *)malloc(sizeof(char)*2);
    meError(sum0);
    sum0[0]='0',sum0[1]=0;;
    for(i=0;i<len2;i++)
    {
        addStrs[i]=p10ByStr(addStrs[i],i);//在乘法运算中,最后累加要乘10
        if(sum1==NULL)
        {
            sum1=addByStr(sum0,addStrs[i]);
            free(sum0);
            sum0=NULL;
        }
        else
        {
            sum0=addByStr(sum1,addStrs[i]);
            free(sum1);
            sum1=NULL;
        }
        free(addStrs[i]);
        addStrs[i]=NULL;
    }
    if(sum0)
        sum=sum0;
    else
        sum=sum1;
    free(addStrs);
    addStrs=NULL;
    return sum;
}
char *multByStr1(char *str1,char c2)//多位数字符串与单位数字符串相乘
{
    int len1=strlen(str1),i=len1-1,a,b,c=0;
    char *mulStr=(char *)malloc(sizeof(char)*(len1+2)),*p=mulStr;
    meError(mulStr);
    memset(mulStr,0,sizeof(char)*(len1+2));
    b=c2-'0';
    while(1)
    {
        a=str1[i]-'0';
        *p=((a*b)+c)%10+'0';
        c=((a*b)+c)/10;
        p++;
        if(i==0)
        {
            if(c>0)
                *p=c+'0';
            break;
        }
        i--;
    }
    inversion(mulStr);
    return mulStr;
}
char *addByStr(char *str1,char *str2)
{
    int len1=strlen(str1),len2=strlen(str2),maxSize,i=len1-1,j=len2-1,a,b,c=0;
    char *addStr=NULL,*p=NULL;
    if(len1>len2)//多留两位,一位给结束符号,一位给进位
        maxSize=len1+2;
    else
        maxSize=len2+2;
    addStr=(char *)malloc(sizeof(char)*maxSize);
    meError(addStr);
    memset(addStr,0,sizeof(char)*maxSize);
    p=addStr;
    while(1)
    {
        if(i<0)
            a=0;
        else
            a=str1[i]-'0';
        if(j<0)
            b=0;
        else
            b=str2[j]-'0';
        *p=(a+b+c)%10+'0';//从后往前,每一位做加运算并保存余数和进位(数组中结果是反向存储的,最后再将数组倒置)
        c=(a+b+c)/10;
        p++;
        if(i<=0 && j<=0)
        {
            if(c>0)
                *p=c+'0';
            break;
        }
        i--;
        j--;
    }
    //--------------数组倒置------------------
    inversion(addStr);
    return addStr;
}
char *inversion(char *str)//倒置字符串
{
    char *p=str,*pd=&str[strlen(str)-1],cs;
    while(p<pd)
    {
        cs=*p;
        *p=*pd;
        *pd=cs;
        p++;
        pd--;
    }
    return str;
}
void meError(void *p)//内存申请失败
{
    if(p==NULL)
    {
        printf("
异常:内存申请失败!回车结束程序!
");
        while(getch()!='');
        exit(0);
    }
}


n!用递归很好做。
统计0的个数时先把n!转换为string类型,方法有这三个:
1.)String s = String.valueOf(i);
2.)String s = Integer.toString(i);
3.)String s = "" + i;
然后定义一个整型变量:
int flag = 0;
用for循环搜索0:
for(int i = 0;i < s.length(); i++){
if(s[i] == '0') flag++;
}
结束之后flag里就是0的个数。
代码是直接在文本框里打的,但应该没问题,不是小白的话应该能看懂

有 【N/5】 个零 , N/5 取整数。

有多少个0。


用VB设计程序对任意自然数n求出s=1\/2 + 2\/3 + 3\/4 +***+ (n-1)\/n
添加一个命令按纽,代码如下 Private Sub Command1_Click()Dim n As Long, i As Long, s As Double s = 0 n = InputBox("输入自然数n的值")For i = 1 To n s = s + i \/ (i + 1)Next i Print "s=" & s End Sub

编写程序:在0~1000中任意选一个数,输出其各位数之和
这些题 1. 随机产生30~100 (包括30 、100 )的20个正整数,显示整个数组的值,并求最大值、最小值、平均值,显示结果。2. 编写一个程序,在文本框中任意输入一个自然数N,单击“计算”按钮则将斐波那契数列的第N项显示在标签中,如图压缩包中所示。sy62.rar 3. 编写一个英文打字训练的程序,...

一个自然数N有20个因数,N的最小值为多少?求解题全过程及思路。_百度...
解题过程如下:①20=20×1=19+1,N的最小值为:2的19次方等于524288,②20=2×10=(9+1)×(1+1),N的最小值为:2的9次方×3=1536,③20=4×5=(4+1)×(3+1),N的最小值为:2的4次方×3的3次方=432,④20=2×2×5=(4+1)×(1+1)×(1+1),N的最小值为:2...

二次函数怎麽解?
for i=1 to 15 x=x\/2 next i print x end ps:java中幂的算法是Math.pow(2, 20);返回double,稍微注意一下 例 3 : 验证谷角猜想。日本数学家谷角静夫在研究自然数时发现了一个奇怪现象:对于任意一个自然数 n ,若 n 为偶数,则将其除以 2 ;若 n 为奇数,则将其乘以 3 ,然后...

求解步骤与文档规范pascal
一.问题描述:所谓H数, 是指该数除1以外,只有2,3,5,7四种因子。如:630即为满足条件的H数,而22却不是。要求对键盘输入的自然数N,求出第N个H数。如:当N=30时,应输出49。这里规定的H数不超过长整型数的范围。二.问题分析:题目要求的H数不超过长整型范围,即最多可达 2^31 数量级,显...

用C语言编写:输入n个自然数,求它们的积.
include <stdio.h> main(){int a[100],m,i,sum=1;printf("input how many numbers you need:\\n");scanf("%d",&m);for(i=0;i<m;i++){scanf("%d",&a[i]);sum*=a[i];} printf("\\nthe ans is%d",sum);} 如果sum超出int的范围,你可以试着用long类型。

求初一下册奥数题
3、对于一个自然数n,如果能找到自然数a和b,使n=a+b+ab,则称n为一个“好数”,例如:3=1+1+1×1,则3是一个“好数”,在1~20这20个自然数中,“好数”共有( )个。 二、 1、设A、B是抛物线y=2x²+4x-2上的点,原点位于线段AB的中点处。试求A、B两点的坐标。 2、10个学生参加n个课外小组,...

...打印出各位上的数字。 输入格式 一行,一个自然数n
include <stdio.h>void main(){ int num; int n1, n2, n3; \/\/ 第一,第二和第三位数 \/* 输入部分 *\/ scanf( "%d", &num ); \/* 判断它是几位数,并依次打印每位数 *\/ if( num >= 100 ){ printf( "3位数" ); n1 = num \/ 100; n2 = ( num...

c语言,从键盘中输入一个正整数n分别求1到n之间所有个位数是3或5的数的...
printf("1到%d之间所有个位数是3或5的数的和为:%d\\n", n, sum);return 0;} 在这个程序中,我们使用 for 循环遍历从 1 到 n 的所有整数,判断它们的个位数是否为 3 或 5,如果是,则将它们的和累加到变量 sum 中。最终输出变量 sum 的值,即为题目所求。需要注意的是,题目要求输入一...

给找十道奥数题,急求,在线等,如果有简单又好,再加20财富
对于一个自然数n,如果能找到非零自然数k和l,使得n=k+f+kl,则称n为一个“好数”,如3=1+1+1×1,故3是一个“好数”。在1,2,…,g这g个自然数中,“好数”共有___个。9.设上题答数为h。甲、乙、丙三个足球队按一种新记分办法进行循环赛。这种记分办法规定;每胜一场得10分,每平一场双方各得...

浦东新区13931333658: c++编程:输入一个自然数n,求 n!,同时统计结果中有多少个0. -
宗侨血平: #include <stdio.h>#include <iostream.h> int factorial(int n) //计算n!{ int i; long sum=1;for(i=1;i<=n;i++) sum*=i; return sum; } int account(int m) //计算n!里面0的个数 { int i=0; //存放0的个数 while(m>=10) { if(m%10==0) i++; m/=10; } return i; } void ...

浦东新区13931333658: 用C语言输入一个自然数n,求n!,同时统计结果中有多少个0 -
宗侨血平: n!应该会求吧.就是1*2*3*4*5*....*n. 1.把数字转化成字符串,统计结果中0的个数.#include #include int Digit(int n) { int d = 0; do{ ++d; n /= 10; }while(n > 0 || n < 0); return d; } void itoa(int n, char* des) { if(n > 0) { int x = (int)pow(10.0, Digit(n)-1); *des...

浦东新区13931333658: C语言程序设计: 输入一个自然数n,求n!,同时统计结果中有多少个0 -
宗侨血平: 答案如下:#include<stdio.h> void main() { int n,z=0; long s=1; printf("input n:"); scanf("%d",&n); for(int i=2;i<=n;i++) s*=i; printf("%d!=%ld\n",n,s); while(s/10!=0) { if(s%10==0) z++; s/=10; } printf("there are %d zero in %ld\n",z,s); } 验证通过!

浦东新区13931333658: 输入一个自然数n,求n!,同时统计结果中有多少个0.
宗侨血平: #include <stdio.h> void main() { int n; double mul=1; int i; int sum=0; printf("请输入n:"); scanf("%d",&n); for(i=1;i<=n;i++) { mul=mul*i; } int m=(int)mul; while(m>0) { if((int)m%10==0) sum++; m=m/10; } printf("n!=%d,其中有%d个0\n",(int)mul,sum); }

浦东新区13931333658: 编程我已经写了,但一直显示有错 输入一个自然数n,求 n!,同时统计结果中有多少个0. -
宗侨血平: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16#include <stdio.h> // 自己想的算法,计算 末尾 0 的个数. intfun(intn) {intzeros = 0;for(intpow= 5; pow<= n ; pow*= 5){zeros += n / pow;}returnzeros; } voidmain() { intn;printf("输入一个整数:");scanf("%d",&n);printf("\n结果有%d个零\n",fun(n)); }

浦东新区13931333658: 用VB语言做程序,输入一个自然数n,求 n!,同时统计结果中有多少个0. -
宗侨血平: dim n as long n = clng(text1.text) dim b as long dim m as long m = 1 for b = 1 to n m = m * b next b print m '显示n! dim s as string dim s2 as string s = cstr(m) s2 = replace(s, "0", "") dim j as long j憨常封端莩得凤全脯户 = len(s) - len(s2) print j '计算结果中0的个数

浦东新区13931333658: 输入一个自然数n,求n!,同时统计结果中有多少个0的流程图 -
宗侨血平: program jiecheng01; Var s,i,n:integer;begins:=1;readln(n);if n<>1 thenFOR i:=1 to n do s:=s*(s+i);writeln(s);readln; end.

浦东新区13931333658: vb编程 输入一个整数n,求n!,同时统计结果中有多少个0 -
宗侨血平: Private Sub Form_Click() Dim n As Integer, s As String s = 1: k = 0 n = Val(InputBox("请输入n值", "n值", "5")) For i = 1 To n '计算n!值 s = Val(s) * i Next i For i = 1 To Len(s) '统计0的个数 If Mid(s, i, 1) = "0" Then k = k + 1 Next i MsgBox n & "!=" & s & " , 其中有" & k & "个0 ." End Sub

浦东新区13931333658: 输入一个自然数n,求n!,同时统计结果中有多少个0程序分析解释 -
宗侨血平: 不知道你要详细到什么程度!首先要明白求N!结果中未尾0个数的算法思想:N的2的因子多于5的因子,有一个5的因子就可得到一个0,N 可以分解出几个5的因子就可得到几个0.(例如求2008!未尾0的个数:2008/5+2008/25+2008/125+2008/...

浦东新区13931333658: 问:java输入一个自然数n,求n阶乘 ,同时统计结果中有多少个0 刚才的代码你知道怎么加用户界面吗? -
宗侨血平: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Fact extends JFrame implements ActionListener { JTextField txtNum, txtFact, txtZero; JButton btnCalculate; public Fact(){ super("计算阶乘"); txtNum = new JTextField(10...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网