大(長)浮點數加法
阿新 • • 發佈:2021-01-30
技術標籤: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;
}
}