加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

用大数乘法计算阶乘

发布时间:2020-12-14 01:59:17 所属栏目:大数据 来源:网络整理
导读:在比较小的范围内阶乘可以递归实现,而求更大的数的阶乘一般用到long long长整形数,不过,即使这样,在耗时和再大些的阶乘上力有不逮,所以,在输入比较大的情况下,用大数乘法计算阶乘是最好的选择。 计算过程分2步: 1、输入字符串s,将它的值保存到整型n

在比较小的范围内阶乘可以递归实现,而求更大的数的阶乘一般用到long long长整形数,不过,即使这样,在耗时和再大些的阶乘上力有不逮,所以,在输入比较大的情况下,用大数乘法计算阶乘是最好的选择。
计算过程分2步:
1、输入字符串s,将它的值保存到整型n中;
2、从1~i~n-1循环将i转化为字符串并和s做大数乘法,每次将结果保存在字符数组r中,r初始化等于s,在计算过程中动态开辟的空间大小是strlen(i)+strlen(r);

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>

char* ff(char *a,char *b){//大数乘法
    int lena=strlen(a); int lenb=strlen(b);
    int len=lena+lenb;
    char *result=(char *)malloc(sizeof(char)*(len+1));
    memset(result,'0',len);
    result[len]='';   
    for(int i=lena-1;i>=0;i--){
        int t=0,p=0,q=0,temp=0;
        int j;
        for(j=lenb-1;j>=0;j--){
            p=(b[j]-'0')*(a[i]-'0');
            temp=result[i+j+1]-'0'+p%10+t;
            result[i+j+1]=temp%10+'0';
            t=temp/10+p/10;
        }
        if(t){
            result[i+j+1]=result[i+j+1]+t;
        } 
    }
    if(result[0]=='0')return result+1;
    return result;
}

void dd(int n,char *b){//将整数转化为字符串
    int i=0;
    while(n){
        b[i++]=n%10+'0';
        n=n/10;
    }
}

void reserve(char *b){//将字符串逆序
    for(int i=0;i<=(strlen(b)-1)/2;i++){
        int t=b[i];
        b[i]=b[strlen(b)-i-1];
        b[strlen(b)-i-1]=t;
    }
}
int main(){
    char c;
    char *a=(char*)malloc(sizeof(char)*1000);   
    char *b=(char*)malloc(sizeof(char)*1000);
    char *result=a;
    memset(a,'',1000);    
    memset(b,1000);
    scanf("%s",a); 
    int n=atoi(a);      
    if(n==1){
        puts(a);
        return 0;
    };
    for(int i=1;i<n;i++){
        dd(i,b);
        reserve(b);
        result=ff(result,b);            
    }       
    puts(result);
    free(result);
    free(a);
    free(b);
    return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读