日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

K:大数加法

發布時間:2025/7/14 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 K:大数加法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

相關介紹:

?在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為例進行加法的計算過程。

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

  • 將兩個加數的相應位從高位到低位依次壓入棧sA和sB中。
  • 若兩個加數棧都非空,則依次從棧中彈出棧頂數字相加,和存入變量partialSum中,若和有進位,則將和的個位數壓入結果棧sum中,并將進位數加到下一位數字相加的和中,若和沒有進位,則直接將和壓入結果棧sum中
  • 若某個加數堆棧為空,則將非空加數棧中的棧頂數字依次彈出與進位相加,和的個位數壓入結果棧sum中,直到此該棧為空為止,若最高位有進位,則最后將1壓入棧sum中
  • 若兩個加數棧都為空,則棧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)));elsethrow 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

    回到目錄|·(工)·)

    轉載于:https://www.cnblogs.com/MyStringIsNotNull/p/8206746.html

    總結

    以上是生活随笔為你收集整理的K:大数加法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。