大數相乘演算法 List實現
寫在前面
週五騰訊模擬筆試(2016.03.25),出了個題,關於大數相乘的問題。這樣的題以前也有,網上也有很多實現程式碼(筆者寫完演算法後搜尋了一下,確有很多,並未細看,並不知道是否有和筆者相同的解決方案)。筆者將演算法用java實現,寫出來給各位參考一下,不足之處,請各位多多指正。
問題
問題描述
輸入兩個整數,要求輸出兩個整數的乘積,該乘積可能超出整型範圍。
問題分析
首先,依題意,肯定是不能用兩個整數直接相乘,得到結果。故要考慮分解問題,即如何將兩個大數的乘法,換成一系列小一點的數的運算。由此,筆者根據小學豎式,想到了不進位乘法,覺得可以用不進位乘法來解決大數相乘的問題。至此,演算法已經確定,接下來就是如何處理兩個整數和其乘積了。筆者自以為可以用ArrayList來儲存。
演算法描述
基本思想:採用不進位乘法計算,然後再將結果進行轉換
如計算12345*123 (num1*num2)
1 2 3 4 5 list1 5 4 3 2 1
* 1 2 3 list2 3 2 1
————————————————
3 6 9 12 15
2 4 6 8 10
1 2 3 4 5
——————————————————————
1 4 10 16 22 22 15 listres 15 22 22 16 10 4 1
轉換為:
1 5 1 8 4 3 5
注意:list中,資料儲存的順序是從最低位開始,依次到最高位
演算法實現
具體實現程式碼如下:
import java.util.ArrayList;
/**
* @Title: 大數相乘list實現(本例中指標對大整數)
* @Description: 給定兩個大數,其相乘結果可能超出整數的範圍,
* 溢位。通過本演算法實現大數相乘,並列印結果。
* @author : JerryZhou
* @date:2016年3月27日
* @version:V1.0
*/
public class bigNumMultiple {
/*
* 基本思想:採用不進位乘法計算,然後再將結果進行轉換
* 如計算12345*123 (num1*num2)
* 1 2 3 4 5 list1 5 4 3 2 1
* * 1 2 3 list2 3 2 1
* ————————————————
* 3 6 9 12 15
* 2 4 6 8 10
* 1 2 3 4 5
* ——————————————————————
* 1 4 10 16 22 22 15 listres 15 22 22 16 10 4 1
* 轉換為:
* 1 5 1 8 4 3 5
* 注意:list中,資料儲存的順序是從最低位開始,依次到最高位
*/
public static void main(String[] args) {
int a =12345;
int b = 123;
Multiple(a,b);
}
/**
* @Title Multiple
* @Description 大數相乘,列印結果
* @param num1
* @param num2
*/
public static void Multiple(int num1,int num2){
ArrayList<Integer> list1 = new ArrayList<Integer>();
ArrayList<Integer> list2 = new ArrayList<Integer>();
ArrayList<Integer> listres = new ArrayList<Integer>();
if(num1<num2){ //將較大的數放在前面
int tmp = 0;
tmp = num1;
num1 = num2;
num2 = tmp;
}
while(num1/10!=0){ //將num1,從個位開始,依次存入list1中
list1.add(num1 % 10);
num1 = num1 / 10;
}
list1.add(num1);
while(num2/10!=0){ //將num2,從個位開始,依次存入list2中
list2.add(num2 % 10);
num2 = num2 / 10;
}
list2.add(num2);
int firstlen = list1.size(); //num1的位數
int secondlen = list2.size(); //num2的位數
for(int i = 0;i < secondlen; i++){ //不進位乘法運算
for(int j = 0;j< firstlen;j++){
if(listres.size()<j+i+1){
listres.add(0);
listres.set(j+i, listres.get(j+i)+list1.get(j)*list2.get(i));
}else{
listres.set(j+i, listres.get(j+i)+list1.get(j)*list2.get(i));
}
}
}
int len = listres.size();
for(int i =0;i<len;i++){ //結果轉換
if(listres.get(i)>9){
int temp = listres.get(i)/10;
listres.set(i, listres.get(i)%10);
if(listres.size()<i+2){ //考慮到最高為的進位問題,可能導致list需要開闢新空間
listres.add(0);
}
listres.set(i+1,listres.get(i+1)+temp);
}else{
continue;
}
}
while(len>0){ //列印大數相乘的最後結果
System.out.print(listres.get(len-1));
len-=1;
}
}
}
以上程式經筆者測試,確實是成功解決了大數相乘的問題,但筆者認為還有很大的優化空間。希望各位讀者多多指正。
相關推薦
大數相乘演算法 List實現
寫在前面 週五騰訊模擬筆試(2016.03.25),出了個題,關於大數相乘的問題。這樣的題以前也有,網上也有很多實現程式碼(筆者寫完演算法後搜尋了一下,確有很多,並未細看,並不知道是否有和筆者相同的解決方案)。筆者將演算法用java實現,寫出來給各位參考一下,
字串相乘(大數相乘) python實現
首先講解 兩個小技巧 list 反轉 reverse >>> l=[1,2,3,4,5,6] >>> l.reverse() >>> l [6, 5, 4, 3, 2, 1] str 反轉 [::-1] >>
大數相乘演算法(相加,相減)
所謂大數相乘,就是指數字比較大,相乘的結果超出了基本型別的表示範圍,所以這樣的數不能夠直接做乘法運算。 假設有A和B兩個大數,位數分別為a和b。根據我們平常手動計算乘法的方式可以看出,最終的結果的位數c一定小於等於a+b。 由於數字無法用一個整形變數儲存,很自然的想到用字串
java大數相乘演算法
public class MyMultiply { /** * @param args */ public static void main(String[] args) { // System.out.println("Hello world");
倆個大數相乘(java實現)
package com.example; /** * * @author ZHANGHAOHAO089 * @date 2017/6/27 */ public class BigNumber
大數相乘(分治法實現時間複雜度為O(n^1.59))
/* * Author: dengzhaoqun * Date: 2011/04/11 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #
大數相乘問題--演算法思想及Java實現解析(附詳細註釋)
大整數乘法(): 兩個乘數比較大,最後結果超過了整型甚至長整型的最大範圍,如果要得到精確結果,常規計算方法已經不適用。 這裡採用分治的思想,將乘數“分割”,將大整數計算轉換為小整數計算。 (附:博文針對正整數計算) 思路解析: 3 4 (大的整數作為被乘數恐怕是
兩大數相乘 -- javascript 實現
name content asc rip ont str1 () != bst (function (){ var addLarge = function(n1,n2){ var carry = 0; var ret = ""; n1=n1.toString(); n2
實現兩個大數相乘
stringbu pos 代碼 HR main length top new oid 牛客網鏈接-大數相乘 思路: 內心知道這種方法是可以通過的,但是賊雞兒麻煩。 輸入兩個字符串。按照筆算乘法的方式,循環計算。考慮到進位的問題。 代碼: package top.simu
大數相加演算法實現
所謂的大數相加就是,數字的長度超出了計算機int64的儲存範圍,需要使用字串儲存進行相加 相加的邏輯,類似與我們小學算加法,列等式進行相加,如果大於等於10則需要進位 下面將用不同語言來實現 Python實現(支援帶小數點大數) #!/usr/bin/env python3 # -*- cod
劍指offer——大數相乘問題(BigInteger的大致實現思路)
乘法運算可以分拆為兩步:第一步,是將乘數與被乘數逐位相乘;第二步,將逐位相乘得到的結果,對應相加起來。 public class BigInt { public static void
C++實現——兩個大數相乘
#include <iostream> #include <vector> #include <string> using namespace std; //
經典演算法之分治法 大數相乘
題目描述: 用串的形式表示大數的乘法。 即求類似: "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實現)
上大學演算法分析實驗課的內容.關於利用分治法大整數乘法.還沒有解決大整數的儲存方式,應該是要利用一維陣列來解決.所以目前只是5位數的運算沒有問題.程式健全 1/** *//** 2 * 大整數項乘 3 * @author Administrator 4 * 5 */ 6import java.io.B
關於大數相乘問題(Java實現)
//假設有兩個數,這兩個數非常大而且無法用Java的整數型別表示,遠遠超出計算機的表達範圍,用計算這兩個數相乘的結果。我們首先應該想用字串來表達這兩個數,假設這兩個字串為n與m,那麼這兩個數相乘結果的位數為n+m或者是n+m-1,通過藉助輔助空間O(n+m)來儲
【JAVA演算法】大數相乘
寫在前面: 我也是一名java語言的愛好者,僅以此文作為學習的記錄,對於文中出現的程式碼規範,程式碼格式,演算法效率等問題,希望各路大神不吝賜教,在下感激不盡。同是學習的同學也同樣希望互相交流,取長補短。
大數相乘以及其高效演算法
測試用例: 999 999 998001 999999999999 999999999999 999999999998000000000001 下面分析下999*999 6 5 4 6 5 4 36 30 24 30 2
分布式大數據系統巧實現,全局數據調度管理不再難
存在 png 但是 影響 商業 system 驗證 題目 創建 背景 看到這個題目,我們會有很多疑問:什麽是分布式大數據系統中的全局數據管理?為什麽要從全局對數據進行管理?這種對數據從全局進行分布和調度的策略是在什麽樣的背景下產生的?如果我們不解決全局數據管理的問題,分布式