大數運算(不包括除法)

來源:互聯網
上載者:User

/**<br /> * 該演算法實現了大數+、-、x,但是沒有實現對負數的處理,因為處理負數可以通過判斷大小去規避這個問題。另外除法沒有實現<br /> *<br /> * @author jie.xiang<br /> *<br /> */<br />public class BigNumberCounter {<br />public BigNumberCounter() {<br />}<br />/**<br /> * 當大數位元不相等的時候,往前面添加0,使其位元一致<br /> *<br /> * 對大數相減,不足即與前面借位。<br /> *<br /> * @param beforNum<br /> * @param afterNum<br /> * @return<br /> * @author jie.xiang<br /> */<br />public String subNumbers(String beforNum, String afterNum) {<br />int bLen = beforNum.length();<br />int aLen = afterNum.length();<br />int maxLength = Math.max(bLen, aLen);<br />int distance = Math.abs(bLen - aLen);<br />StringBuffer result = new StringBuffer();<br />if (bLen > aLen) {<br />afterNum = getZeroNumbers(distance) + afterNum;<br />} else {<br />beforNum = getZeroNumbers(distance) + beforNum;<br />}<br />int carry = 0;<br />for (int i = maxLength - 1; i >= 0; i--) {<br />int a = Integer.parseInt(beforNum.charAt(i) + "") - carry;<br />int b = Integer.parseInt(afterNum.charAt(i) + "");<br />carry = 0;<br />if (a < b) {<br />a += 10;<br />carry = 1;<br />if (i == 0) {<br />result.append("-");<br />}<br />}<br />result.append(String.valueOf(a - b));<br />}<br />return result.reverse().toString();<br />}<br />/**<br /> * 當大數位元不相等的時候,往前面添加0,使其位元一致<br /> *<br /> * 相加的值,與10產生的餘數為結果,除以十位進位的內容。<br /> *<br /> * @param beforNum<br /> * @param afterNum<br /> * @return<br /> * @author jie.xiang<br /> */<br />public String addNumbers(String beforNum, String afterNum) {<br />int bLen = beforNum.length();<br />int aLen = afterNum.length();<br />int maxLength = Math.max(bLen, aLen);<br />int distance = Math.abs(bLen - aLen);<br />StringBuffer result = new StringBuffer();<br />if (bLen > aLen) {<br />afterNum = getZeroNumbers(distance) + afterNum;<br />} else {<br />beforNum = getZeroNumbers(distance) + beforNum;<br />}<br />int tempValue = 0;<br />int carry = 0;<br />for (int i = maxLength - 1; i >= 0; i--) {<br />int a = Integer.parseInt(beforNum.charAt(i) + "");<br />int b = Integer.parseInt(afterNum.charAt(i) + "");<br />tempValue = a + b + carry;<br />result.append(tempValue % 10);<br />carry = tempValue / 10;<br />}<br />if (carry > 0) {<br />result.append(carry);<br />}<br />return result.reverse().toString();<br />}<br />private String getCharNumbers(int length, String ch) {<br />StringBuffer result = new StringBuffer();<br />for (int i = 0; i < length; i++) {<br />result.append(ch);<br />}<br />return result.toString();<br />}<br />private String getZeroNumbers(int length) {<br />return getCharNumbers(length, "0");<br />}<br />/**<br /> * 大數相乘,逐位相乘,每個值與10產生的餘數為結果,除以十位進位的內容,每次的值與前一位相乘的值相乘<br /> *<br /> * @param beforNum<br /> * @param afterNum<br /> * @return<br /> * @author jie.xiang<br /> */<br />public String mutiNumbers(String beforNum, String afterNum) {<br />int bLen = beforNum.length();<br />int aLen = afterNum.length();<br />int tempValue = 0;<br />int carry = 0;<br />String aNumber = "0";<br />for (int i = aLen - 1; i >= 0; i--) {<br />int a = Integer.parseInt(afterNum.charAt(i) + "");<br />StringBuffer sb = new StringBuffer();<br />String bNumber = "0";<br />carry = 0;<br />if (a == 0) {<br />continue;<br />}<br />for (int j = bLen - 1; j >= 0; j--) {<br />int b = Integer.parseInt(beforNum.charAt(j) + "");<br />tempValue = a * b + carry;<br />sb.append(tempValue % 10);<br />carry = tempValue / 10;<br />}<br />if (carry > 0) {<br />sb.append(carry);<br />}<br />bNumber = sb.reverse().toString() + getZeroNumbers(aLen - i - 1);<br />bNumber = addNumbers(aNumber, bNumber);<br />aNumber = bNumber;<br />}<br />return aNumber;<br />}<br />/**<br /> * 過濾結果,去除多餘的0<br /> *<br /> * @param values<br /> * @return<br /> */<br />private String getNoPrefixZero(String values) {<br />String result = "";<br />int i = 0;<br />char zero = '0';<br />for (; i < values.length(); i++) {<br />if (values.charAt(i) != zero) {<br />break;<br />}<br />}<br />result += values.substring(i);<br />if (result.length() == 0) {<br />result = "0";<br />}<br />return result;<br />}<br />/**<br /> * @param args<br /> */<br />public static void main(String[] args) {<br />BigNumberCounter counter = new BigNumberCounter();<br />System.out.println(counter.addNumbers(<br />"99999999999999999999999999999999999999999999", "1"));<br />System.out.println(counter.mutiNumbers("9999999999999999999999999",<br />"9999999999999999999999999999999"));<br />String value = counter.subNumbers(<br />"25411111111111111111111111111111111111111136",<br />"343453534546546757676856");<br />System.out.println(counter.getNoPrefixZero(value));<br />}<br />}<br />

 

這幾天突然被演算法題難住了,確實忘記了哦,好久沒做了,現在有時間自己再寫寫這些基本問題,基礎不能忘啊,呵呵

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.