1. 程式人生 > 其它 >大(長)浮點數加法

大(長)浮點數加法

技術標籤:PAT 甲級

(C++程式碼)轉載連結:https://blog.csdn.net/qq_36721800/article/details/104649796

牛客連結:https://www.nowcoder.com/practice/ddec753f446e4ba4944e35378ba635c8?tpId=61&tqId=29551&tPage=3&ru=/kaoyan/retest/1002&qru=/ta/pku-kaoyan/question-ranking

java程式碼

public class Solution extends Calculator{
    @Override
public Object add(Object leftValue, Object rightValue) { String s1 = leftValue.toString(); String s2 = rightValue.toString(); if (s1.indexOf(".")==-1 && s2.indexOf(".")==-1){ //如果不含小數,普通的大整數加法 return add(s1,s2); }
else{ return addFloatNum(s1,s2); } } public String addFloatNum(String num1, String num2) {//兩個浮點大數相加,小數點位數任意 String result = ""; int pos1,pos2,len1,len2; len1 = num1.length(); len2 = num2.length(); pos1 = num1.indexOf('.'
); pos2 = num2.indexOf('.'); //分別剝離兩個數的整數和小數部分 String num1a = num1.substring(0, pos1); String num1b = num1.substring(pos1+1, len1); String num2a = num2.substring(0, pos2); String num2b = num2.substring(pos2+1, len2); //整數部分相加 String rsOne = addBigInt(num1a, num2a); //小數位對齊,不足的補0 int i,nZeroes,maxLen; maxLen = (num1b.length()>num2b.length()) ? num1b.length() : num2b.length(); if (num1b.length()>num2b.length()) {//第一個數的小數部分長,則第二個補不足的0 nZeroes = num1b.length() - num2b.length();//待補的0的個數 for (i = 0; i < nZeroes; ++i) { num2b += '0'; } } else if(num2b.length() > num1b.length()) {//第二個數的小數部分長,則第一個補不足的0 nZeroes = num2b.length() - num1b.length();//待補的0的個數 for (i = 0; i < nZeroes; ++i) { num1b += '0'; } } //小數位對齊準備完畢,進行小數部分相加 String rsTwo = addBigInt(num1b, num2b); if (rsTwo.length() > maxLen) { //說明有進位, 剝離第一位進位,加到整數部分去 String nAddOn = rsTwo.substring(0,1); rsOne = addBigInt(rsOne, nAddOn); rsTwo = rsTwo.substring(1,rsTwo.length()); } //兩部分結果拼湊起來 StringBuilder sb = new StringBuilder(rsOne); sb.append("."); sb.append(rsTwo); result = sb.toString(); return result; } public String addBigInt(String num1, String num2) { //大整數相加 String result = ""; int len1 = num1.length(); int len2 = num2.length(); int nAddOn = 0; int i,j,n1,n2,sum; StringBuilder sb = new StringBuilder(); for (i = len1 - 1,j = len2 - 1 ; i >= 0 && j >= 0; --i,--j) { n1 = num1.charAt(i) - '0'; n2 = num2.charAt(j) - '0'; sum = n1 + n2 + nAddOn; if (sum >= 10) { nAddOn = 1; }else { nAddOn = 0; } sb.append(sum % 10); } if (len1 > len2) { for (; i >= 0; --i) { n1 = num1.charAt(i) - '0'; sum = n1 + nAddOn; if (sum >= 10) { nAddOn = 1; }else{ nAddOn = 0; } sb.append(sum % 10); } }else if (len2 > len1) { for (; j >= 0; --j) { n2 = num2.charAt(j) - '0'; sum = n2 + nAddOn; if (sum >= 10) { nAddOn = 1; }else { nAddOn = 0; } sb.append(sum % 10); } } if (nAddOn > 0) { sb.append(nAddOn); } sb.reverse(); result = sb.toString(); return result; } }