6-10 阶乘计算升级版 (20分)乘法的高精度算法(每日一划)

本题要求实现一个打印非负整数阶乘的函数。

函数接口定义:

void Print_Factorial ( const int N );

其中N是用户传入的参数,其值不超过1000。如果N是非负整数,则该函数必须在一行中打印出N!的值,否则打印“Invalid input”。

裁判测试程序样例:

#include <stdio.h>

void Print_Factorial ( const int N );

int main()
{
    int N;

    scanf("%d", &N);
    Print_Factorial(N);
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:
15
输出样例:
1307674368000

该题的主要思想就是用一个数组来存放计算的数字,而每次的计算都不会超过计算机可运算的范围。

#define max 30000
void Print_Factorial ( const int N )
{   
    if(N<0) {
        printf("Invalid input\n");
        return ;
    }
    int number_[max]={0};
    number_[0]=1;
    int i,j,k;
    for(i=2;i<=N;i++)//从 i=2开始乘,到N结束
    {
        int c=0;//用来记录i与数组里某一元素相乘的值
        for(j=0;j<max;j++){//这里自己画一个数组,按照步骤填一下就能意会到了,类似自己手写乘法
            int s=number_[j]*i+c;
            number_[j]=s%10;
            c=s/10;
        }
    }
    for(k=max-1;number_[k]==0;k--);//找出最后一个数字,比如5231,找5的下标,需要倒着找到第一个不为0的元素
    for(k;k>=0;k--)//倒着输出数组元素
        printf("%d",number_[k]);
}

进行了优化修改的代码(是参考别人的)

#define max 30000
void Print_Factorial ( const int N )
{   
    if(N<0) {
        printf("Invalid input\n");
        return ;
    }
    int number_[max]={0};
    number_[0]=1;
    int i,j,k,t=0;
    for(i=2;i<=N;i++)
    {
        int c=0;
        for(j=0;j<=t;j++){
            int s=number_[j]*i+c;
            number_[j]=s%10;
            c=s/10;
        }
        while(c){
            number_[++t]=c%10;
            c/=10;
        }
    }
    for(k=t;k>=0;k--)
        printf("%d",number_[k]);
}

这里就不过多解释了,倘若看懂第一个了,自己思考下就知道在那些地方做了优化。没看懂的话,可以留言~

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值