K:大數加法

来源:https://www.cnblogs.com/MyStringIsNotNull/archive/2018/01/05/8206746.html
-Advertisement-
Play Games

相關介紹:  在java中,整數是有最大上限的。所謂大數是指超過整數最大上限的數,例如18 452 543 389 943 209 789 324 233和8 123 534 323 432 323 432 123 212 443就是兩個大數,在java中這是無法用整型int變數或長整型l ...


相關介紹:

 在java中,整數是有最大上限的。所謂大數是指超過整數最大上限的數,例如18 452 543 389 943 209 789 324 233和8 123 534 323 432 323 432 123 212 443就是兩個大數,在java中這是無法用整型int變數或長整型long變數來進行保存的,更不用說保存他們之間相加的和了。為解決該問題,可以把兩個相加數看成是字元串,將這些數的相應數字存儲在兩個堆棧中,並從兩個棧中彈出對應位的數字依次執行加法可得到結果,以784和8465為例進行加法的計算過程。

784和8465的加法過程

對於兩個大數的加法,其操作步驟歸納如下:

  1. 將兩個加數的相應位從高位到低位依次壓入棧sA和sB中。
  2. 若兩個加數棧都非空,則依次從棧中彈出棧頂數字相加,和存入變數partialSum中,若和有進位,則將和的個位數壓入結果棧sum中,並將進位數加到下一位數字相加的和中,若和沒有進位,則直接將和壓入結果棧sum中
  3. 若某個加數堆棧為空,則將非空加數棧中的棧頂數字依次彈出與進位相加,和的個位數壓入結果棧sum中,直到此該棧為空為止,若最高位有進位,則最後將1壓入棧sum中
  4. 若兩個加數棧都為空,則棧sum中保存的就是計算結果。註意棧頂是所得計算結果的最高位

其代碼如下:

package queueandstack;
import java.util.Stack;
/**
 * 該類用於演示大數加法的相關代碼
 * @author 學徒
 *
 */
public class BigNumberAdd
{
    /**
     * 求兩個大數的和,加數與被加數以字元串的形式輸入(允許大數中出現空格),計算的結果也以字元串的形式返回
     */
    public String add(String number1,String number2)throws Exception
    {
        Stack result=new Stack();//大數的和
        Stack number1Stack=numberSplit(number1);//加數字元串以單個字元的形式放入棧中
        Stack number2Stack=numberSplit(number2);//被加數字元串以單個字元的形式放入棧中
        int partialSum;//對於兩個位的求和
        boolean isCarry=false;//進位標誌
        while(!number1Stack.isEmpty()&&!number2Stack.isEmpty())//加數和被加數棧同時非空
        {
            partialSum=(Integer)number1Stack.pop()+(Integer)number2Stack.pop();//對於兩個位進行求和,併在棧中去除掉加數和被加數中的該位
            //當有低位的進位時
            if(isCarry)
            {
                partialSum++;
                isCarry=false;
            }
            //需要進行進位
            if(partialSum>=10)
            {
                partialSum-=10;
                isCarry=true;
            }
            //將本位的結果放入結果棧中
            result.push(partialSum);
        }
        Stack temp=!number1Stack.isEmpty()?number1Stack:number2Stack;//將temp引用指向加數和被加數中非空棧
        while(!temp.isEmpty())
        {
            //當最後一次加法運算中存在進位的時候
            if(isCarry)
            {
                int t=(Integer)temp.pop();//取出其中的加數或者被加數中沒有參加的位
                ++t;//進位加到此位上
                if(t>=10)//當其需要進行進位的時候
                {
                    t-=10;
                }
                else//重置其進位標誌
                {
                    isCarry=false;
                }
                result.push(t);
            }
            else//最後一次執行加法運算中不需要進位
            {
                result.push(temp.pop());//把加數或者被加數中非空的值放入和中
            }
        }
        if(isCarry)//將最高位加入到結果中
        {
            result.push(1);
        }
        String resultstr=new String();
        while(!result.isEmpty())
        {
            //把棧中的元素轉化為字元串
            resultstr=resultstr.concat(result.pop().toString());
        }
        return resultstr;
    }
    
    /**
     * 該方法用於將輸入的大數拆分成單個的字元,並去掉字元串中的空格,返回以單個字元為元素的棧
     * 
     */
    public Stack numberSplit(String str)throws Exception
    {
        Stack result=new Stack();
        for(int i=0;i<str.length();i++)
        {
            char c=str.charAt(i);//指定索引處的char值
            if(' '==c)//去除掉空格
                continue;
            else if('0'<=c&&'9'>=c)//將數字放入棧中
                result.push(Integer.valueOf(String.valueOf(c)));
            else
                throw new Exception("錯誤:輸入了非數字型的字元!");
        }
        return result;
    }
    /**
     * 用於測試程式
     */
    public static void main(String[] args)throws Exception
    {
        BigNumberAdd a=new BigNumberAdd();
        System.out.println("兩個大數為:");
        System.out.println("1. 18 452 543 389 943 209 752 345 473");
        System.out.println("2. 8 123 542 678 432 986 899 334");
        System.out.println("其和為:");
        System.out.println(a.add("18 452 543 389 943 209 752 345 473", "8 123 542 678 432 986 899 334"));
    }
}


運行結果:
兩個大數為:
1. 18 452 543 389 943 209 752 345 473
2. 8 123 542 678 432 986 899 334
其和為:
18460666932621642739244807

回到目錄|·(工)·)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • DBUtils工具包 一.介紹 DBUtils是Apache組織開源的資料庫工具類。 二.使用步驟 ①.創建QueryRunner對象 ②.調用update()方法或者query()方法執行sql語句 三.構造方法及靜態方法 QueryRunner類 1.構造方法 ①.無參構造 QueryRunne ...
  • 我們在Java容器中談到:有哈希表(也稱為散列表)支持的HashMap、LinkedHashSet等都具有非常高的查詢效率。這其中就是Hash起的作用。順序查找的時間複雜度為O(N) ,二分查找和查找樹的時間複雜度為O(logN),而 哈希表的時間複雜度為O(1) 。不過這隻是理想狀態,實際並不那麼 ...
  • python選修課學習中練手寫的,主要就是查詢bilibili提供得api 整理結果csv https://pan.baidu.com/s/1jHX2fJ4 ...
  • JDK1.8中的HashMap實現跟JDK1.7中的實現有很大差別。下麵分析JDK1.8中的實現,主要看put和get方法。 構造方法的時候並沒有初始化,而是在第一次put的時候初始化 putVal方法的主要邏輯是這樣的: 1、如果數組還沒有初始化(數組長度是0),則先初始化 2、通過hash方法計 ...
  • 方法和c++中的函數類似,區別在於java的方法定義不限位置,而c++中的定義在主函數後面的函數調用前要聲明: 求矩形面積方法示例: 輸出:面積是:30 調用過程分析: 1.從main進入,開始執行程式 2.調用getArea方法,傳遞參數,得到返回值 3.輸出 調用過程記憶體分析: 1.程式運行時期 ...
  • 相關介紹:  括弧分隔符匹配問題是指,判斷所輸入的字元串表達式中的括弧是否匹配的問題,例如1+(12+2)\ (1+2)便是一個括弧分隔符匹配的表達式,而(12+1) 4+(12/2]就是一個括弧分隔符不匹配的表達式  判斷一個表達式括弧分隔符是否匹配,其思路如下:依次讀取該表達 ...
  • 枚舉類型 枚舉類型就是預先定義的一類常量集合,如一周的時間、水果的類型等。需要註意的幾點內容如下: 定義枚舉類時,Java預設繼承java.lang.Enum,所以定義的枚舉類不能繼承其他類型; 枚舉類中可以包含成員變數、成員函數,但枚舉常量的定義再所有field和method之前,並以“;”結束; ...
  • 1. try & except 原程式: 1 import math 2 3 while True: 4 text = raw_input('> ') 5 if text[0] == 'q': 6 break 7 x = float(text) 8 y = math.log10(x) 9 print ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...