1. 程式人生 > >63-題目1137:浮點數加法

63-題目1137:浮點數加法

題目描述:

求2個浮點數相加的和
題目中輸入輸出中出現浮點數都有如下的形式:
P1P2...Pi.Q1Q2...Qj
對於整數部分,P1P2...Pi是一個非負整數
對於小數部分,Qj不等於0

輸入:

對於每組案例,第1行是測試資料的組數n,每組測試資料佔2行,分別是兩個加數。
每組測試資料之間有一個空行,每行資料不超過100個字元

輸出:

每組案例是n行,每組測試資料有一行輸出是相應的和。
輸出保證一定是一個小數部分不為0的浮點數

這道題題目有毛病,測試用例有問題,我總是出現RUNTIME ERROR的錯誤!而且他們好多AC的程式碼都用的是STL或者直接用庫函式寫的,相比起來我的程式碼又長又亂。。。。但是我在本地測試結果是正確的!
#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;
}