1. 程式人生 > >經典演算法之分治法 大數相乘

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

題目描述:

用串的形式表示大數的乘法。

即求類似: "23234845847839461464158174814792" * "6457847285617487843234535"
要求結果返回一個串。

解題思路:

採用分治法解題.具體方式已在程式碼中註釋.

程式碼實現:

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		System.out.println(multi("1234567890987654321666", "1234567890123456789555"));
		//System.out.println(new BigInteger("1234567890987654321666").multiply(new BigInteger("1234567890123456789555")));   //檢驗
	}

	public static String multi(String a, String b) {
		//出口 整數假設只有int型別
		if (a.length() <= 4 && b.length() <= 4) return Integer.parseInt(a) * Integer.parseInt(b) + "";
		
		if (a.length() > 4) {
			//分治
			int k = a.length()/2;
			String a1 = a.substring(0, k);
			String a2 = a.substring(k);
			
			return add(multi(a1, b) + zero(a2.length()),multi(a2, b));
		}
		return multi(b, a);  //b比a大則a,b交換
	}

	public static String zero(int n) {  //補零操作 n為需要補的個數
		if (n == 0) return "";
		if (n == 1) return "0";
		return zero(n/2) + zero(n/2) + zero(n%2);  //分治
	}

	public static String add(String a, String b) {   //大整數加法
		if (a.length() <= 8 && b.length() <= 8) return Integer.parseInt(a) + Integer.parseInt(b) + "";
		
		String a1 = "0";   //用於儲存a前a.length()-8個數
		String a2 = a;  //用於儲存a的後8位
		if (a.length() > 8) {
			a1 = a.substring(0, a.length() - 8);
			a2 = a.substring(a.length() - 8);
		}
		
		String b1 = "0";   //用於儲存b前b.length()-8個數
		String b2 = b;  //用於儲存b的後8位
		if (b.length() > 8) {
			b1 = b.substring(0, b.length() - 8);
			b2 = b.substring(b.length() - 8);
		}
		
		String t = add(a2, b2);
		while (t.length() < 8) t = "0" + t;  //若a的後8位與b的後8位之和的位數小於8位則前面補0
		if (t.length() > 8) return add(add(a1, b1), "1") + t.substring(1);  //如果t的位數大於8,則需進位,由於兩個8位數之和最大為1開頭的九位數,故進1
		return add(a1, b1) + t;  //如果t的長度剛好為8,無需其他操作,直接遞迴
	}
}


執行除錯:


相關推薦

經典演算法治法 大數相乘

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

軟體設計師演算法治法--歸併排序

    最近準備要考中級軟體設計師。該門考試涉及到演算法相關的,剛好也順帶著整理下之前自己學習過的知識。     演算法的學習沒有什麼捷徑,就是理解演算法思想和邏輯。最重要的一點,一定要自己編寫程式碼,除錯通過,這樣才算是完成了演算法的學習。      2路歸併排序就是每次

五大常用演算法治法

五大常用演算法之 分治法 分治法的設計思想是,將一個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。 分治策略是:對於一個規模為n的問題,若該問題可以容易地解決(比如說規模n較小)則直接解決,否則將其分解為k個規模較小的子問題,這些子問題互相獨立

基本演算法治法

合併排序 合併排序的時間複雜度為:O(nlogn),最壞情況下的鍵值比較次數接近於任何基於比較的排序演算法的理論上能夠達到的最小次數,主要缺點是該演算法需要線性的額外空間。 #include "stdafx.h" #include<iostream> using

演算法原理與分析治法

一.目錄 1.演算法基本原理 2.經典問題 二.分治法基本原理     分而治之,先將原問題的規模下降,分解為子問題,此所謂“分”,然後解決子問題,此為“治”。     分治法的基本思想是將一個規模為n的原問題分解為k個規模較小的子問題,這些子問題互相獨立且與原問題相同。遞

演算法治法二分查詢

一、分治法(三步) 分解:待解決的問題 分成 若干個子問題,子問題的求解方式跟之前的問題一樣 治理:各個子問題求解 合併:子問題的解合併 二、二分查詢 1.前提條件           有序的集合或者陣列 2.演算法思想       a.定位中間的元素

js演算法治法-歸併排序合併有序陣列

     合併有序陣列是合併排序重要的一步,下面js演示了每一步的操作過程  附程式碼: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEA

雙目立體匹配經典演算法Semi-Global Matching(SGM)概述:視差計算、視差優化

文章目錄 視差計算 視差優化 剔除錯誤匹配 提高視差精度 抑制噪聲 視差計算   在SGM演算法中,視差計算採用贏家通吃(WTA)演算法,每個畫素選擇最小聚

雙目立體匹配經典演算法Semi-Global Matching(SGM)概述:代價聚合(Cost Aggregation)

  由於代價計算步驟只考慮了局部的相關性,對噪聲非常敏感,無法直接用來計算最優視差,所以SGM演算法通過代價聚合步驟,使聚合後的代價值能夠更準確的反應畫素之間的相關性,如圖1所示。聚合後的新的代價值儲存在與匹配代價空間C同樣大小的聚合代價空間S中,且元素位置一一對應。 圖1:代價聚合

雙目立體匹配經典演算法Semi-Global Matching(SGM)概述:匹配代價計算Census變換(Census Transform,CT)

  基於互資訊的匹配代價計算由於需要初始視差值,所以需要通過分層迭代的方式得到較為準確的匹配代價值,而且概率分佈計算稍顯複雜,這導致代價計算的效率並不高。學者Zabih和Woodfill 1 提出的基於Census變換法也被廣泛用於匹配代價計算。Census變換是使用畫素鄰域內的區域性灰

雙目立體匹配經典演算法Semi-Global Matching(SGM)概述:匹配代價計算互資訊(Mutual Information,MI)

  半全域性立體匹配演算法Semi-Global Matching,SGM由學者Hirschmüller在2005年所提出1,提出的背景是一方面高效率的區域性演算法由於所基於的區域性視窗視差相同的假設在很多情況下並不成立導致匹配效果較差;而另一方面全域性演算法雖然通過二維相鄰畫素視差之間

Java中的經典演算法選擇排序(SelectionSort)

Java中的經典演算法之選擇排序(SelectionSort) 神話丿小王子的部落格主頁 a) 原理:每一趟從待排序的記錄中選出最小的元素,順序放在已排好序的序列最後,直到全部記錄排序完畢。也就是:每一趟在n-i+1(i=1,2,…n-1)個記錄中選取關鍵字最小的記錄作為有序序列中第i個記錄。基

大資料探勘領域十大經典演算法—CART演算法(附程式碼)

簡介 CART與C4.5類似,是決策樹演算法的一種。此外,常見的決策樹演算法還有ID3,這三者的不同之處在於特徵的劃分: ID3:特徵劃分基於資訊增益 C4.5:特徵劃分基於資訊增益比 CART:特徵劃分基於基尼指數 基本思想 CART假設決策樹是二叉樹,

機器學習十大經典演算法K-近鄰演算法(學習筆記)

演算法概述 K-近鄰演算法(k-Nearest Neighbor,KNN)是機器學習演算法中最簡單最容易理解的演算法。該演算法的思路是:給定一個訓練資料集,對新的輸入例項,在訓練資料集中找到與該例項最鄰近的K個例項, 這K個例項的多數屬於某個類,就把該輸入例項分

資料探勘領域十大經典演算法—樸素貝葉斯演算法(超詳細附程式碼)

簡介 NaïveBayes演算法,又叫樸素貝葉斯演算法,樸素:特徵條件獨立;貝葉斯:基於貝葉斯定理。屬於監督學習的生成模型,實現簡單,沒有迭代,並有堅實的數學理論(即貝葉斯定理)作為支撐。在大量樣本下會有較好的表現,不適用於輸入向量的特徵條件有關聯的場景。 基本思想 (1)

資料探勘領域十大經典演算法—SVM演算法(超詳細附程式碼)

簡介 SVM(Support Vector Machine)中文名為支援向量機,是常見的一種判別方法。在機器學習領域,是一個有監督的學習模型,通常用來進行模式識別、分類以及迴歸分析。 相關概念 分類器:分類器就是給定一個樣本的資料,判定這個樣本屬於哪個類別的演算法。例如在股

機器學習十大經典演算法決策樹(學習筆記整理)

一、決策樹概述 決策樹是一種樹形結構,其中每個內部節點表示一個屬性上的測試,每個分支代表一個測試輸出,每個葉節點代表一種類別。決策樹是一個預測模型,代表的是物件屬性與物件值之間的一種對映關係。 最初的節點稱為根節點(如圖中的"顏色"),有分支的節點稱為中間節點

經典演算法希爾排序(三種實現)

希爾排序的實質就是分組插入排序,該方法又稱縮小增量排序,因DL.Shell於1959年提出而得名。 該方法的基本思想是:先將整個待排元素序列分割成若干個子序列(由相隔某個“增量”的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素

js演算法治法-歸併排序

歸併排序(合併排序)是一個遞迴演算法,這個演算法的理解其實可以藉助下面這個圖: 對於原始的陣列2,1,3,8,5,7,6,4,10,在整個過程執行的是順序是途中紅色編號1-20。雖然我們描述中說的是程式先分解,再歸併,但實際過程是一邊分解一邊歸併,前半部分分先排好序,後半

資料探勘十大經典演算法K-means 演算法

K-means演算法(非監督性學習) 1.演算法思想         k-means演算法是一種簡單的迭代型聚類演算法,採用距離作為相似性指標,從而發現給定資料集中的K個類,且每個類的中心是根據類中所有值的均值得到,每個類