M-高精度小数求和_哈尔滨华德学院天梯赛选拔赛(重现赛) (nowcoder.com)
1. 将小数点前后的数字用0补齐
2. 处理最后的小数点位数容易不清楚 用char ans[ ]数组储存,然后进行操作
3. 去除前导0的思想
while(C.back( ) == 0 && C.size( ) > 1) C.pop_back( );
while(ans[cnt] == '0' && ans[cnt - 1] != '.') cnt--;
#include <bits/stdc++.h>
using namespace std;
string a,b;
vector<int> A,B,C;
void opt(int n,int m)
{
for(int i = n;i >= 0;i--)
if(a[i] != '.') A.push_back(a[i] - '0');
for(int i = m;i >= 0;i--)
if(b[i] != '.') B.push_back(b[i] - '0');
}
void add(vector<int> &A,vector<int> &B)
{
int t = 0;
for(int i = 0;i < A.size();i++)
{
if(i < B.size()) t += B[i];
t += A[i];
C.push_back(t % 10);
t /= 10;
}
if(t) C.push_back(t);
}
int main()
{
cin >> a >> b;
int x = a.size() - a.find('.') - 1,sx = a.find('.');
int y = b.size() - b.find('.') - 1,sy = b.find('.');
for(int i = 0;i <= max(x,y);i++)
{
if(x <= i) a += '0'; // 最后一位多补一个0 确保小数点后至少有一位0
if(y <= i) b += '0';
}
for(int i = 0;i <= max(sx,sy);i++)
{
if(sx < i) a.insert(a.begin(),'0'); // 不用多补一个0
if(sy < i) b.insert(b.begin(),'0');
}
opt(a.size() - 1,b.size() - 1);
add(A,B);
char ans[410];
int cnt = 0;
for(int i = C.size() - 1;i >= 0;i--)
{
if(i == max(x,y)) ans[++cnt] = '.';
ans[++cnt] = C[i] + '0';
}
while(ans[cnt] == '0' && ans[cnt - 1] != '.') cnt--; // 去除多余的0
for(int i = 1;i <= cnt;i++) cout << ans[i];
return 0;
}