趋势科技笔试第一题8.8
输入两个超长由数字和小数点组成字符串数字,计算其最后结果,要求:
不损失精度,
收尾不出现无意义的0;
不得使用字符意外的函数
输入:两个string
输出:最后两数结果
思路:
1.首先计算小数点位置,小数少的字符串后面补齐0;
2.设置连个迭代器,指向每个字符串的最后一位;
3.迭代器指向的字符对应的数字相加如果大于9,设置进位符为1;
4.循环进行,遇到小数点,原样打印。
5.判断哪个字符先到最开始位置,如果到达开始位置,则只对剩下的字符串和进位信息进行类似处理。
#include<iostream>
#include<string>
using namespace std;
string add1(string& a1, string& a2)
{
int pos_a1 = a1.size()-a1.find('.');
int pos_a2 = a2.size()-a2.find('.');
int len = 0;
if ((pos_a1 - pos_a2) > 0)
{
len = pos_a1 - pos_a2;
for (int i = 0; i <len; i++)
{
a2 += "0";
}
}
else
{
len = pos_a2 - pos_a1;
for (int i = 0; i <len; i++)
{
a1 += "0";
}
}
string::iterator p_a1 = a1.end() - 1;
string::iterator p_a2 = a2.end() - 1;
string res;
int t = 0;
while (p_a2>=a2.begin()&&p_a1>=a1.begin())
{
if ((*p_a2) == '.'&&(*p_a1) == '.')
{
res += '.';
p_a2--;
p_a1--;
continue;
}
char tmp = ((*p_a1)-'0' + (*p_a2)-'0'+t);
if (tmp <= 9)
{
res += to_string(tmp);
if (t == 1)
t = 0;
}
else if (tmp>9)
{
t = 1;
res += to_string(tmp % 10);
}
if (p_a1 == a1.begin())
{
break;
}
if (p_a2 == a2.begin())
{
break;
}
p_a2--;
p_a1--;
}
if (p_a1 == a1.begin()&&p_a2!=a2.begin())
{
p_a2--;
while (p_a2 >= a2.begin())
{
if (t == 1)
{
int tmp = (*p_a2 - '0' + t);
if (tmp > 9)
{
t == 1;
res += to_string(tmp % 10);
}
else
{
res += to_string(tmp);
if (t == 1)
t = 0;
}
}
else
{
res += *p_a2;
}
if (p_a2 == a2.begin())
break;
p_a2--;
}
}
if (p_a2 == a2.begin()&&p_a1!=a1.begin())
p_a1--;
{
while (p_a1 >= a1.begin())
{
if (t == 1)
{
int tmp = (*p_a1 - '0' + t);
if (tmp > 9)
{
t == 1;
res += to_string(tmp % 10);
}
else
{
res += to_string(tmp);
if (t == 1)
t = 0;
}
}
else
{
res += *p_a1;
}
if (p_a1 == a1.begin())
break;
p_a1--;
}
}
reverse(res.begin(), res.end());
string::iterator it = res.begin();
while (it != res.end())
{
if (*it == '0')
{
res.erase(it);
}
else
break;
}
it = res.end()-1;
while (it != res.begin())
{
if (*it == '0')
{
res.erase(it);
it--;
}
else
break;
}
return res;
}
int main()
{
string A, B;
cin >> A >> B;
string res = add1(A, B);
cout << res;
system("pause");
}
