A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

飞羽流殇

初级黑马

  • 黑马币:26

  • 帖子:9

  • 精华:0

© 飞羽流殇 初级黑马   /  2019-3-29 14:59  /  665 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

因为做了一个练习题,要实现阶乘,阶乘的结果十分容易超出基本数据类型的存储上限,然后我就想做一个String类型实现的乘法.....没那么容易超限

public class T3 {
    /**
     * 三、 在数学中10!代表10的阶乘。既代表1*2*3*4....*10;
     * 现在要求编程求出8!。
     */
    public static void main(String[] args) {
        int i = 8;
        String sum = "1";
        for (int j = 1; j < i+1; j++) {
            sum = multiply(sum,""+j);
        }
        System.out.println("8!="+sum);
    }

    /**
     * 实现大数相乘
     * @param num1 String
     * @param num2 String
     * @return String
     */
    public static String multiply(String num1,String num2){
        int length1 = num1.length();
        int length2 = num2.length();

        int[] num = new int[length1+length2];//用来存储运算结果
        for (int i = 0; i < length1; i++) {
            int n1 = num1.charAt(length1-1-i)-'0';//逐一获得num1(没有参与运算)最后一位的数字
            int temp = 0;//用来临时保存一位的中间结果
            for (int j = 0; j < length2; j++) {
                int n2 = num2.charAt(length2-1-j)-'0';//逐一获得num2(没有参与运算)最后一位的数字
                temp = n1*n2 + temp + num[i+j];//当前数字相乘+本次循环的进位+上次循环的进位
                num[i+j] = temp%10;//只取个位
                temp /= 10;//进位保留
            }
            num[i+length2] = temp;//存储进位数字
        }
        //计算结果的长度
        int i = length1+length2-1;
        while(i>0 && num[i]==0){
            i--;
        }
        //当前的结果个十百千,我们习惯看到的是千百十个
        String str = "";
        while(i>=0){
            str += num[i];
            i--;
        }
        return str;
    }
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马