大数阶乘

大数阶乘

比如求100的阶乘,开始初始化 a[0] = 1,此时 digit 等于 1,数组中有效数据:1;

然后用 2 去乘 a[0],即2 * 1 = 2,将 2 存储到a[0],此时 digit 等于 1,数组中有效数据:2;

然后用 3 去乘 a[0],即3 * 2 = 6,将 6 存储到a[0],此时 digit 等于 1,数组中有效数据:6;

然后用 4 去乘 a[0],即4 * 6 = 24,将 24 的最低位 4 存储到a[0]中,此时进位为2,然后将进位 2 存储到a[1]中,然后将 digit 加 1,此时 digit 等于 2,数组中有效数据:4 2;

然后用 5 去乘 a[0],即 5 * 4 = 20,将 20 的最低位 0 存储到a[0]中,此时进位为 2,然后用 5去乘a[1]再加上进位2,即 5 * 2 + 2 = 12,将12的最低位2存储到a[1]中,此时进位为1,然后将进位的 1 存储到a[3]中。此时 digit 等于 3,数组中有效数据 0 2 1。

剩下的依此类推。

思路分析:

乘法规则:让乘数与被乘数的低位到高位依次相乘,加上每位计算的进位数,依次得到每一位的结果。

程序模拟时,无论乘数有多少位,都将乘数看成一个整体,与被乘数的低位相乘加上该位的进位数得到临时变量,取临时变量的最后一位得到我们需要的一位(%10),并存储到数组中,除去最低位后的数作为下一位的进位数(up = temp/10)。被乘数的每一位都被乘完之后,如果进位数不为0,说明结果需要扩大,则将剩余结果输入到数组中,并增加记录位数的digit

public class BigNumJieCheng {
    public static void main(String[] args) {
        int n = 100;
        int[] a = new int[20001];
        a[0] = 1;//从1开始乘
        int digit = 1;//记录数组中结果的位数
        int temp = 0;//记录每次运算后的得数
        
        for(int i = 2; i <= n; i++){
            int up = 0;//存储进位,比如4 * 6的时候,会产生2这个进位
            for(int j = 0; j < digit; j++){// 让数组a中的每一位有效元素都与i相乘
                temp = a[j] * i + up;//将存储在数组中的数分别乘以i,并加上进位的数up
                a[j] = temp % 10;//将得数的最后一位进行存储
                up = temp / 10;
            }
            while(up != 0){
                a[digit] = up % 10;
                up = up / 10;
                digit++;
            }
        }
        for(int i = digit - 1; i >= 0; i--){
            System.out.print(a[i]);
        }
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

静波波呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值