1. 程式人生 > >java大數相乘演算法

java大數相乘演算法

public class MyMultiply {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// System.out.println("Hello world");

		//String str1 = "1234";
		//String str2 = "1234";
		//String str1 = "1076060999";
		//String str2 = "90188905567";
		String str1 = "23456789009877666555544444";
		String str2 = "346587436598437594375943875943875";

		int len1 = str1.length();
		int len2 = str2.length();

		char[] s1 = str1.toCharArray();
		char[] s2 = str2.toCharArray();

		// 高低位對調
		covertdata(s1, len1);
		covertdata(s2, len2);

		System.out.println("乘數:"+str1);
		System.out.println("乘數:"+str2);
		multiply(s1, len1, s2, len2);

	}

	public static void covertdata(char data[], int len) {
		//高低位對調
		for (int i = 0; i < len / 2; i++) {
			data[i] += data[len - 1 - i];
			data[len - 1 - i] = (char) (data[i] - data[len - 1 - i]);
			data[i] = (char) (data[i] - data[len - 1 - i]);
		}
	}

	public static void multiply(char a[], int alen, char b[], int blen) {
		// 兩數乘積位數不會超過乘數位數和+ 3位
		int csize = alen + blen + 3;
		// 開闢乘積陣列
		int[] c = new int[csize];
		// 乘積陣列填充0
		for (int ii = 0; ii < csize; ii++) {
			c[ii] = 0;
		}
		// 對齊逐位相乘
		for (int j = 0; j < blen; j++) {
			for (int i = 0; i < alen; i++) {
				c[i + j] +=  Integer.parseInt(String.valueOf(a[i]))* Integer.parseInt(String.valueOf(b[j]));
			}
		}
		int m = 0;
		// 進位處理
		for (m = 0; m < csize; m++) {
			int carry = c[m] / 10;
			c[m] = c[m] % 10;
			if (carry > 0)
				c[m + 1] += carry;
		}
		// 找到最高位
		for (m = csize - 1; m >= 0;) {
			if (c[m] > 0)
				break;
			m--;
		}
		// 由最高位開始列印乘積
		System.out.print("乘積:");
		for (int n = 0; n <= m; n++) {
			System.out.print(c[m - n]);
		}
		System.out.println("");
	}
}

相關推薦

java大數相乘演算法

public class MyMultiply { /** * @param args */ public static void main(String[] args) { // System.out.println("Hello world");

suseoj 1207: 大整數的乘法(java, 大數相乘)

描述 ann ron reat n) 不能 creat ble 一個 1207: 大整數的乘法 時間限制: 1 Sec 內存限制: 128 MB提交: 7 解決: 2[提交][狀態][討論版][命題人:liyuansong] 題目描述 求兩個不超過200位的非負整數的

大數相乘演算法(相加,相減)

所謂大數相乘,就是指數字比較大,相乘的結果超出了基本型別的表示範圍,所以這樣的數不能夠直接做乘法運算。 假設有A和B兩個大數,位數分別為a和b。根據我們平常手動計算乘法的方式可以看出,最終的結果的位數c一定小於等於a+b。 由於數字無法用一個整形變數儲存,很自然的想到用字串

大數相乘演算法 List實現

寫在前面 週五騰訊模擬筆試(2016.03.25),出了個題,關於大數相乘的問題。這樣的題以前也有,網上也有很多實現程式碼(筆者寫完演算法後搜尋了一下,確有很多,並未細看,並不知道是否有和筆者相同的解決方案)。筆者將演算法用java實現,寫出來給各位參考一下,

JAVA大數相乘

package huawei; import java.math.BigDecimal; public final class Demo { /************************************************************

JAVA演算法大數相乘

寫在前面:    我也是一名java語言的愛好者,僅以此文作為學習的記錄,對於文中出現的程式碼規範,程式碼格式,演算法效率等問題,希望各路大神不吝賜教,在下感激不盡。同是學習的同學也同樣希望互相交流,取長補短。                                 

大數相乘問題--演算法思想及Java實現解析(附詳細註釋)

大整數乘法(): 兩個乘數比較大,最後結果超過了整型甚至長整型的最大範圍,如果要得到精確結果,常規計算方法已經不適用。 這裡採用分治的思想,將乘數“分割”,將大整數計算轉換為小整數計算。 (附:博文針對正整數計算) 思路解析:    3  4  (大的整數作為被乘數恐怕是

牛客網 最短路 Floyd演算法 Dijkstra演算法 Java大數

 連結:https://www.nowcoder.com/questionTerminal/a29d0b5eb46b4b90bfa22aa98cf5ff17 來源:牛客網 最短路徑 熱度指數:2992 時間限制:1秒 空間限制:65536K 演算法知識視訊講解

兩個大數相加和兩個大數相乘-------java版(曾經面試遇到過)

    瀏覽部落格偶然看到https://blog.csdn.net/Colin_Qichao/article/details/81538327中給出的大數相乘演算法,想到曾經有次面試時也被問到了該問題,於是仔細的研究了一下,並按照其思路寫了一個兩個大數相加的演算法(這個問題也被

JAVA高精度演算法 BigInteger用法詳解 大數四則運算

在用C或者C++處理大數時感覺非常麻煩,但是在Java中有兩個類BigInteger和BigDecimal分別表示大整數類和大浮點數類,至於兩個類的物件能表示最大範圍不清楚,理論上能夠表示無線大的數,只要計算機記憶體足夠大。 這兩個類都在java.math.*包中,因此每次必須在開頭處引用該包。

大數相乘問題(java版)

將兩個大數儲存到字串中,他們相乘的結果也儲存到字串中,那麼無論多大的數,都能夠用這種方法去解決。 首先看下我們數學上怎麼去計算兩個數字相乘的: 如果我們用程式把上面的過程寫出來,那麼這個問題就解決了。 java程式碼如下: package com.zyk.model;

經典演算法之分治法 大數相乘

題目描述: 用串的形式表示大數的乘法。 即求類似: "23234845847839461464158174814792" * "6457847285617487843234535" 要求結果返回一個串。 解題思路: 採用分治法解題.具體方式已在程式碼中註釋. 程式

C語言大數相乘問題普通演算法->acm.scu.edu.cn:1002

問題描述: Calculate A × B Input The input will consist of a series of pairs of integers a and b, separa

分治演算法思想(4)未——兩個大數相乘,歐冠冠軍盃比賽日程安排

(1)分治演算法基礎解題一般步驟:1.分解,將要解決的問題劃分成若干規模較小的同類問題2.求解,當子問題劃分的足夠小時,用較簡單的方法解決3.合併,按原問題的要求,將子問題的解逐層合併構成原問題的解此方法主要是對分治的理解,以及結果的調整和對結果的合併。較難理解~需仔細思考(

兩個大數相乘JAVA

import java.util.Scanner; public class BigNumMul { public static void main(String[] args) { Scanner canner = new Scan

JAVA兩個大數相乘

大數處理是科研過程中常見的問題,尤其在天文學,氣象學等。在面試中,大數處理,尤其是兩個大數相乘更是常客。在Java語言中,長整型long佔8個位元組,能表示的最大值為2^64 = 9223372036854775807(Long.MAX_VALUE),而這隻有19位,分配到

倆個大數相乘java實現)

package com.example; /** * * @author ZHANGHAOHAO089 * @date 2017/6/27 */ public class BigNumber

關於大數相乘問題(Java實現)

//假設有兩個數,這兩個數非常大而且無法用Java的整數型別表示,遠遠超出計算機的表達範圍,用計算這兩個數相乘的結果。我們首先應該想用字串來表達這兩個數,假設這兩個字串為n與m,那麼這兩個數相乘結果的位數為n+m或者是n+m-1,通過藉助輔助空間O(n+m)來儲

大數相乘以及其高效演算法

測試用例: 999 999 998001 999999999999      999999999999 999999999998000000000001 下面分析下999*999    6    5   4    6   5    4 36 30 24       30 2

大數相乘 -- javascript 實現

name content asc rip ont str1 () != bst (function (){ var addLarge = function(n1,n2){ var carry = 0; var ret = ""; n1=n1.toString(); n2