大数相乘问题(java版)

3 篇文章 0 订阅
1 篇文章 0 订阅

将两个大数保存到字符串中,他们相乘的结果也保存到字符串中,那么无论多大的数,都能够用这种方法去解决。

首先看下我们数学上怎么去计算两个数字相乘的:
这里写图片描述

如果我们用程序把上面的过程写出来,那么这个问题就解决了。

java代码如下:

package com.zyk.model;

import java.util.Scanner;

public class BigNumMuti {
    public static void main(String[] args) {
        Scanner can = new Scanner(System.in);

        try{
            String line1 = can.nextLine().trim();
            String line2 = can.nextLine().trim();
            String result = multiBigInteger(line1,line2);
            System.out.println(result);
        }finally{
            can.close();
        }
    }

    public static String multiBigInteger(String num1, String num2)
    {
         //字符串的长度
        int num1Len = num1.length();        //num1的长度
        int num2Len = num2.length();       //num2的长度

        int i, j, k;                       //循环计数器 
        int res;                           //每次一位相乘/相加的结果
        int carry = 0;                     //进位
        int offset = 0;                    //加法的偏移位

        //每次相乘的结果
        int tempResLen = num1Len;                   //每次相乘结果的最大长度 ,每次num1乘以num2每一位的结果最大长度是num1Len+1,由于下标从0开始,所以减一后约去1,只剩num1Len
        char[] tempRes = new char[tempResLen+2];              //用来保存每次相乘的结果

        //最终结果
        //结果的最大长度
        int resultLen = num1Len + num2Len - 1; //结果长度最大为num1长度和num2长度之和,由于下标从0开始,所以要减一
        char[] result =  new char[resultLen+1];

        for(j = num2Len - 1; j >= 0; j--)
        {
            for(i = num1Len-1; i >= 0; i--)
            {
                res = Integer.parseInt(num1.charAt(i) + "") * Integer.parseInt(num2.charAt(j) + "")  + carry;
                tempRes[tempResLen--] = toChar(res % 10);// 把结果的个位放在结果集里面
                carry = res / 10;//得到结果集进入的数
            }

            //乘数的最后一位数与被乘数的一个数字想成的进位没有算
            //tempRes第一位为进位,刚刚的循环是没有算的,最后把进位算上
            tempRes[tempResLen] = toChar(carry);
            tempResLen = num1Len;
            carry = 0;

            //乘数与被乘数的一位数乘完后,与之前的数字相加
            //由result的末尾开始计算和,算完一次,向左偏移一位
            for(k = resultLen-offset; k > (resultLen-offset-num1Len); k--)
            {
                res = toInt(result[k]) + toInt(tempRes[tempResLen--]) + carry;
                result[k] = toChar(res%10);
                carry = res/10;
            }
            //最后一个相加数的进入
            result[k] = toChar(toInt(result[k]) + toInt(tempRes[tempResLen]) + carry);
            carry = 0;
            tempResLen = num1Len;
            offset++;
        }

        String str = new String (result);
        while (str.startsWith("0")) {
            str = str.substring(1);
        }
        return str;
    }

    public static char toChar(int c){
        return String.valueOf(c).charAt(0);
    }

    public static int toInt(char c){
        try {
            return  Integer.valueOf(c + "");

        } catch (Exception e) {
            return 0;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值