http://115.29.224.174/JudgeOnline/problem.php?id=1053
采用存粹的字符串处理,涉及到
数字的优化(符号处理,去零)
字符串数字大小的比较
字符串的加法
字符串的减法
ac代码
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <string>
using namespace std;
string strAdd(string s1, string s2)
{
string rs ="";
int len1 = s1.size();
int len2 = s2.size();
int carry = 0;
int i = len1 - 1;
int j = len2 - 1;
while(i >= 0 && j >= 0)
{
char c1 = s1[i];
char c2 = s2[j];
int i1 = c1 - '0';
int i2 = c2 - '0';
int tmp = i1 + i2 + carry;
carry = tmp / 10;
int nowVal = tmp % 10;
char nowC = nowVal + '0';
rs += nowC;
i--;
j--;
}
if(i >= 0)
{
while(i >= 0)
{
char c1 = s1[i];
int i1 = c1 - '0';
int tmp = i1 + carry;
carry = tmp / 10;
int nowVal = tmp % 10;
char nowC = nowVal + '0';
rs += nowC;
i--;
}
}
if(j >= 0)
{
while(j >= 0)
{
char c2 = s2[j];
int i2 = c2 - '0';
int tmp = i2 + carry;
carry = tmp / 10;
int nowVal = tmp % 10;
char nowC = nowVal + '0';
rs += nowC;
j--;
}
}
if(carry > 0)
{
char nowC = carry + '0';
rs += nowC;
}
string rs2(rs.rbegin(), rs.rend());
return rs2;
}
// 假设s1 > s2
string strSub(string s1, string s2)
{
string rs ="";
int len1 = s1.size();
int len2 = s2.size();
int need_carry = 0;
int i = len1 - 1;
int j = len2 - 1;
while(i >= 0 && j >= 0)
{
char c1 = s1[i];
char c2 = s2[j];
int i1 = c1 - '0';
int i2 = c2 - '0';
int nowVal;
if(need_carry != 0)
{
if(i1 < need_carry)
{
int tmpi1 = 10 + i1 - need_carry;
nowVal = tmpi1 - i2;
need_carry = 1;
}else{
int tmpc1 = i1 - need_carry;
if(tmpc1 >= i2)
{
nowVal = tmpc1 - i2;
need_carry = 0;
}else{
nowVal = 10 + tmpc1 - i2;
need_carry = 1;
}
}
}else{
if(i1 >= i2)
{
nowVal = i1 - i2;
need_carry = 0;
}else{
nowVal = 10 + i1 - i2;
need_carry = 1;
}
}
char nowC = nowVal + '0';
rs += nowC;
i--;
j--;
}
while(i >= 0)
{
char c1 = s1[i];
int i1 = c1 - '0';
if(i == 0 && i1 == need_carry)
{
break;
}
int nowVal;
if(need_carry != 0)
{
if(i1 < need_carry)
{
int tmpi1 = 10 + i1 - need_carry;
nowVal = tmpi1;
need_carry = 1;
}else{
int tmpc1 = i1 - need_carry;
if(tmpc1 >= 0)
{
nowVal = tmpc1;
need_carry = 0;
}else{
nowVal = 10 + tmpc1;
need_carry = 1;
}
}
}else{
if(i1 >= 0)
{
nowVal = i1 - 0;
need_carry = 0;
}else{
nowVal = 10 + i1 - 0;
need_carry = 1;
}
}
char nowC = nowVal + '0';
rs += nowC;
i--;
}
string rs2(rs.rbegin(), rs.rend());
return rs2;
}
// 得到一个正确的数,把一些无用的零 去掉
string getRs(string ans)
{
int len = ans.size();
if(len <= 0)
return "0";
if(ans[0] == '-')
{
int k = 1;
while(k < len && ans[k] == '0')
k++;
if(k == len)
return "0";
else{
return "-" + ans.substr(k);
}
}else{
int k = 0;
while(k < len && ans[k] == '0')
k++;
if(k == len)
return "0";
else{
return ans.substr(k);
}
}
}
// 判断两个数谁大, 两个数都是有效的正数
int cp(string s1, string s2)
{
int len1 = s1.size();
int len2 = s2.size();
if(len1 > len2)
return 1;
else if(len1 < len2)
return -1;
else{
for(int i=0;i<len1;i++)
{
if(s1[i] > s2[i])
return 1;
if(s1[i] < s2[i])
return -1;
}
}
return 0;
}
// 假设s1 s2 都是合法的数字
string strCal(string s1,string s2)
{
int flag1 = 1;
int flag2 = 1;
if(s1[0] == '-')
{
s1 = s1.substr(1);
flag1 = -1;
}else if(s1[0] == '+')
{
s1 = s1.substr(1);
}
if(s2[0] == '-')
{
s2 = s2.substr(1);
flag2 = -1;
}else if(s2[0] == '+')
{
s2 = s2.substr(1);
}
string ans;
if(flag1 == 1 && flag2 == 1)
{
//return strAdd(s1, s2);
ans = strAdd(s1, s2);
}else if(flag1 == -1 && flag2 == -1)
{
string rs = strAdd(s1, s2);
rs = "-" + rs;
//return rs;
ans = rs;
}else if(flag1 == 1 && flag2 == -1)
{
if(cp(s1, s2) >= 0)
{
//return strSub(s1, s2);
ans = strSub(s1, s2);
}else{
string rs = strSub(s2, s1);
rs = "-" + rs;
//return rs;
ans = rs;
}
}else{
if(cp(s2, s1) >= 0)
{
//return strSub(s2, s1);
ans = strSub(s2, s1);
}else{
string rs = strSub(s1, s2);
rs = "-" + rs;
//return rs;
ans = rs;
}
}
return getRs(ans);
}
int main()
{
//freopen("in.txt", "r", stdin);
string s1,s2;
while(cin >> s1 >> s2)
{
s1 = getRs(s1);
s2 = getRs(s2);
string ans = strCal(s1,s2);
cout << ans << endl;
}
return 0;
}