1. 程式人生 > >大數相乘問題(java版)

大數相乘問題(java版)

將兩個大數儲存到字串中,他們相乘的結果也儲存到字串中,那麼無論多大的數,都能夠用這種方法去解決。

首先看下我們數學上怎麼去計算兩個數字相乘的:
這裡寫圖片描述

如果我們用程式把上面的過程寫出來,那麼這個問題就解決了。

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; } } }