http://ac.jobdu.com/problem.php?pid=1137
-
题目描述:
-
求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;
}