63-題目1137:浮點數加法
阿新 • • 發佈:2019-01-29
- 題目描述:
-
求2個浮點數相加的和
題目中輸入輸出中出現浮點數都有如下的形式:
P1P2...Pi.Q1Q2...Qj
對於整數部分,P1P2...Pi是一個非負整數
對於小數部分,Qj不等於0
- 輸入:
-
對於每組案例,第1行是測試資料的組數n,每組測試資料佔2行,分別是兩個加數。
每組測試資料之間有一個空行,每行資料不超過100個字元
- 輸出:
-
每組案例是n行,每組測試資料有一行輸出是相應的和。
輸出保證一定是一個小數部分不為0的浮點數
#include<iostream> #include<fstream> #include<vector> #include<string> #include<algorithm> using namespace std; int main() { int N; //ifstream cin("data.txt"); while (cin >> N) { getchar(); while (N--) { char a[101] = { '\0' }, b[101] = {'\0'}; int A[210] = { 0 }, B[210] = {0}; int len1 = 0, len2 = 0, pos1, pos2; // 讀入a,b,並確定長度和小數點的位置 while (scanf_s("%c", &a[len1]) && a[len1] != '\n')// 讀入a,判斷換行 { if (a[len1] == '.') pos1 = len1; len1++; } while (scanf_s("%c", &b[len2]) && b[len2] != '\n')// 讀入b,判斷換行,並處理中間空的一行 { if (b[len2] == '.') pos2 = len2; len2++; } //以小數點為界限,將小數點隱藏的放在A[99]-A[100]的位置,小數部分放在A[100-(len1-1-pos1),99],整數部分放在[100,pos1-1+100] int i, j = 0; for (i = 0; i < pos1; i++)//存放整數部分 A[100 + i] = a[pos1-1-i] - '0'; for (i = 1; i <= len1 - 1 - pos1; i++) A[100 - i] = a[i + pos1] - '0'; for (i = 0; i < pos2; i++)//存放整數部分 B[100 + i] = b[pos2 - 1 - i] - '0'; for (i = 1; i <= len2 - 1 - pos2; i++) B[100 - i] = b[i + pos2] - '0'; //相加,A+B->B,有進位則加1 for (int i = 0; i < 210; i++) { int temp = A[i] + B[i]; if (temp >= 10) B[i + 1]++; B[i] = temp % 10; } for (j = 209; B[j] == 0 && j >= 100; j--){} //從右找到最高位 for (i = j; i >= 100; i--) cout << B[i]; if (j == 99) //整數部分為0 cout << "0."; else cout << "."; for (j = 0; B[j] == 0 && j <= 99; j++){}//從左找到找到最低位 for (i = 99; i >= j; i--) cout << B[i]; if (j==100) //小數部分為0 cout << "0"; cout << endl; } } return 0; }