【JAVA演算法】大數相乘
寫在前面:
我也是一名java語言的愛好者,僅以此文作為學習的記錄,對於文中出現的程式碼規範,程式碼格式,演算法效率等問題,希望各路大神不吝賜教,在下感激不盡。同是學習的同學也同樣希望互相交流,取長補短。
java基本型別中long的大小為64bit,能表示的最大整數為2的63次方-1。如果涉及到乘法運算數字超過這個值,顯然就不能用長整形來表示,那麼再不使用BigInteger的情況下,如何進行大數字的運算呢?
提供一種解決方式:利用陣列模擬手工運算乘法的過程。
import java.util.Scanner; public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner = new Scanner(System.in); //用字串接受大數 String a = scanner.next(); String b = scanner.next(); //生成結果陣列anwArray,陣列的大小為輸入兩個字串的長度之和 int[] anwArray = new int[a.length()+b.length()]; //兩個for是模擬乘法運算 for(int i=0;i<a.length();i++){ for(int j=0;j<b.length();j++){ //p是產生的進位 int p = (a.charAt(a.length()-1-i)-'0')*(b.charAt(b.length()-1-j)-'0')/10; //t是剩下的本位 int t = (a.charAt(a.length()-1-i)-'0')*(b.charAt(b.length()-1-j)-'0')%10; //進位根據乘法運演算法則加到對應位置 anwArray[a.length()+b.length()-2-i-j]+=p; anwArray[a.length()+b.length()-1-i-j]+=t; } } //調整結果,因為之前的運算所得到的結果陣列中可能存在一位上是個多位數,接下來要把這些位該進位的進位。 for(int i=0;i<a.length()+b.length()-1;i++){ int p= anwArray[a.length()+b.length()-1-i]/10; int t= anwArray[a.length()+b.length()-1-i]%10; anwArray[a.length()+b.length()-i-2]+=p; anwArray[a.length()+b.length()-i-1]=t; } //輸出陣列,要去除首部的0 int mx = 0;//設定標誌位,直到遇到第一個非零數,將標誌位置1,開始輸出結果 for (int i = 0; i < anwArray.length; i++) { if(anwArray[i]!=0){ System.out.print(anwArray[i]); mx=1; }else { if(mx==1){ System.out.print(anwArray[i]); } } } } }
與計算器的結果比對
相關推薦
【JAVA演算法】大數相乘
寫在前面: 我也是一名java語言的愛好者,僅以此文作為學習的記錄,對於文中出現的程式碼規範,程式碼格式,演算法效率等問題,希望各路大神不吝賜教,在下感激不盡。同是學習的同學也同樣希望互相交流,取長補短。
【java演算法】楊輝三角
【今天的題目】問題描述 楊輝三角形又稱Pascal三角形,它的第i+1行是(a+b)i的展開式的係數。 它的一個重要性質是:三角形中的每個數字等於它兩肩上的數字相加。 下面給出了楊輝三角形的前4行: 1 1 1 1 2 1 1 3 3 1 package tes
【Java演算法】一天24小時中,時針和分針一共重合多少次?
思路:利用時針與分針的夾角來計算。參考:上一篇文章 因為電子鐘錶,錶針的跳動不是連續的,譬如分鐘每次跳動6度,時針每次跳動0.5度。而編寫程式時變數h小時,m分鐘每次增量為1,所以我們設夾角gap為(-6~6之間)。這樣帶來另一個問題,一次重合接近和重合分開甚至是完全重合,
排序演算法之快速排序【java實現】
快速排序是最常用的排序演算法之一,它的平均時間複雜度是O(nlogn),但是它是一個不穩定的演算法。 步驟: 我們要找到一個基值,將小於基值的放在它的左邊,大於它的放在它的右邊。基值我們直接用陣列最左邊的值就行。每次排序會把基值放在正確的位置上,在根據這個值把陣列分成左右兩部分,在進行遞迴處
排序演算法之希爾排序【java實現】
前面介紹的冒泡、選擇、插入排序演算法雖然簡單直觀,但是在排序上的效率一般。對於大量的資料排序就需要更加高效的演算法,那麼下面來介紹一下高效的排序演算法----希爾排序,又稱Shell排序,縮小增量排序。 實際上,希爾排序是基於插入排序的思想。 實現步驟: (1)將有n個元素的陣列分成n/
排序演算法之插入排序演算法【java實現】
插入排序演算法通過對未排序的資料執行逐個插入至合適的位置而完成排序工作。思路簡單,應用較多。但是此演算法在資料無規律的情況下,需要移動大量的資料,效率不高。 步驟: (1)首先對陣列的前兩個資料進行從小到大排序。 (2)接著將第3個數據與排好序的兩個資料進行比較,將第3個數據插入合適的位
排序演算法之選擇排序演算法【java實現】
簡介:遍歷陣列,每次選出最小的數與索引第一個進行交換,直到全部完成。 package zhgyu.sort; /** /*選擇排序演算法 * @author zhgyu * */ public class SelectionSort { static final int SIZE =
排序演算法之氣泡排序【java實現】
氣泡排序介紹 基本思想就是相鄰資料交換,每次將最大或最小的數進行移動。 步驟:(1)對陣列中的各資料,依次比較相鄰的兩個元素的大小。 (2)如果前面的資料大於(小於)後面的資料,就交換這兩個資料。經過第一輪
必須知道的八大種排序演算法【java實現】
各種演算法的時間複雜度: package com.lianxi; import java.util.Arrays; public class Sort { /** * 八種排序演算法 */ public static void main(String[] args) {
【Python】大數相乘
思路: 1. 把資料放到列表中,即list1和list2。 2. 每個list1列表中的第i個元素,與list2列表中的第j個元素相乘,把對應乘積的結果放到下標為(i+j)的列表中。 3. 如果該位的結果大於10,則向後進1。 def list2str(li):
【JAVA面試】JAVA常考點之資料結構與演算法(1)
JAVA常考點之資料結構與演算法(1) JAVA常考點之資料結構與演算法 目錄
【LeetCode-演算法】55. 跳躍遊戲(Java實現)
題目 給定一個非負整數陣列,你最初位於陣列的第一個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後一個位置。 示例1 輸入: [2,3,1,1,4] 輸出: true 解釋: 從位置 0 到 1 跳 1 步, 然後跳 3 步到達最後
【LeetCode-演算法】59. 螺旋矩陣Ⅱ(Java實現)
題目 給定一個正整數 n,生成一個包含 1 到 n2 所有元素,且元素按順時針順序螺旋排列的正方形矩陣。 示例 輸入: 3 輸出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 程式碼實現 class Solutio
【LeetCode-演算法】63. 不同路徑 II(Java實現)
題目 一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。現在考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不同的路徑?
【LeetCode-演算法】75. 顏色分類(Java實現)
題目 給定一個包含紅色、白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。 此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。 注意: 不能使用程式碼庫中的排序函式來解決這道題。 示例
【LeetCode-演算法】 79.單詞搜尋(Java實現)
題目 給定一個二維網格和一個單詞,找出該單詞是否存在於網格中。 單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許被重複使用。 示例: board = [ ['A','B','C
【排序演算法】希爾排序原理及Java實現
1、基本思想: 希爾排序也成為“縮小增量排序”,其基本原理是,現將待排序的陣列元素分成多個子序列,使得每個子序列的元素個數相對較少,然後對各個子序列分別進行直接插入排序,待整個待排序列“基本有序”後,最後在對所有元素進行一次直接插入排序。因此,我們要採用跳躍分
【排序演算法】歸併排序原理及Java實現
1、基本思想: 歸併排序就是利用歸併的思想實現的排序方法。而且充分利用了完全二叉樹的深度是的特性,因此效率比較高。其基本原理如下:對於給定的一組記錄,利用遞迴與分治技術將資料序列劃分成為越來越小的半子表,在對半子表排序,最後再用遞迴方法將排好序的半子表合併成為
必須知道的八大種排序演算法【java實現】(三) 歸併排序演算法、堆排序演算法詳解
一、歸併排序演算法 基本思想: 歸併(Merge)排序法是將兩個(或兩個以上)有序表合併成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然後再把有序子序列合併為整體有序序列。 歸併排序示例: 合併方法: 設r[i…n]由兩個有序子表r[i…m]和r[m+1…n]組
必須知道的八大種排序演算法【java實現】(二) 選擇排序,插入排序,希爾演算法【詳解】
一、選擇排序 1、基本思想:在要排序的一組數中,選出最小的一個數與第一個位置的數交換;然後在剩下的數當中再找最小的與第二個位置的數交換,如此迴圈到倒數第二個數和最後一個數比較為止。 2、例項 3、演算法實現 /** * 選擇排序演算法 * 在未