本题是要做大数加减法,故用string来实现。操作数有以下4种情况:正+正,负+负,正+负,负+正,前两种用加法实现,后两种用减法实现。
大数加法
大数加法实现很简单,首先对齐,之后再进行加法操作即可。
大数减法
大数减法的实现思路是首先判断二者差的符号,这很好判断,而且在算出结果之前就可以判断出来,然后始终令a是绝对值较大的那一个,b是绝对值较小的那一个。接下来也进行对齐操作,然后计算a-b即可,最后加上前面算出的符号。例如计算-123+670,那么判断符号为正,然后令a=670, b=123, 最终结果就是547
#include <iostream>
#include <string>
using namespace std;
//a b 都大于0, 若a > b 返回true,否则返回false
bool cmp(string a, string b)
{
if(a.size() > b.size())
return true;
if(a.size() < b.size())
return false;
for(int i = 0; i < a.size(); i++)
{
if(a[i] == b[i])
continue;
else if(a[i] > b[i])
return true;
else
return false;
}
return false; //a == b;
}
bool compare(string a, string b)
{
if(a[0] == '-' || b[0] == '-')
{
if(a[0] == '-' && b[0] != '-')
return false;
if(a[0] != '-' && b[0] == '-')
return true;
if(a[0] == b[0] && b[0] == '-')
return !cmp(a.substr(1, a.size()), b.substr(1, b.size()));
}
else
return cmp(a, b);
}
string sum(string a, string b)
{
if(a.size() < b.size())
{
string tmp = a;
a = b;
b = tmp;
}
int leng = a.size() - b.size();
for(int i = 0; i < leng; i++)
b = '0'+b;
bool flag = false; //进位位
int tmp;
string ans;
for(int i = a.size()-1; i >= 0; i--)
{
tmp = a[i]+b[i]-'0'-'0' + flag;
if(tmp >= 10)
{
tmp -= 10;
flag = true;
}
else
flag = false;
ans = (char)(tmp+'0') + ans;
}
if(flag)
ans = '1' + ans;
return ans;
}
string sub(string a, string b)
{
bool flag0 = false;
if(a[0] != '-' && a.size() >= b.size())
flag0 = true; //代表减法结果的正负
if(a[0] == '-' && a.size() <= b.size())
flag0 = true;
if(a[0] == '-')
{
string tmp = a;
a = b;
b = tmp;
}
//123 -2345这种情况
if(a.size()+1 < b.size())
{
string tmp = a;
a = b.substr(1, b.size());
b = tmp;
}
//123 -670这种情况
if(a.size()+1 == b.size() && !cmp(a, b.substr(1, b.size())))
{
string tmp = a;
a = b.substr(1, b.size());
b = tmp;
}
if(b[0] == '-')
b = b.substr(1, b.size());
//这时a, b都没有负号,且a是较大的那个, b是较小的那个
int leng = a.size() - b.size();
for(int i = 0; i < leng; i++)
b = '0'+b;
bool flag = false; //借位位
int tmp;
string ans;
for(int i = a.size()-1; i >= 0; i--)
{
tmp = a[i]-b[i] - flag;
if(tmp < 0)
{
tmp += 10;
flag = true;
}
else
flag = false;
ans = (char)(tmp+'0') + ans;
}
if(flag0)
return ans;
else
return '-'+ans;
}
int main()
{
int n;
cin >> n;
string a, b, c;
for(int i = 1; i <= n; i++)
{
cin >> a >> b >> c;
string ans;
if(a[0] == '-' && b[0] != '-' || a[0] != '-' && b[0] == '-')
ans = sub(a, b);
else if(a[0] == b[0] && b[0] == '-')
ans = '-' + sum(a.substr(1, a.size()), b.substr(1, b.size()));
else
ans = sum(a, b);
//cout << "--------- "<< ans << endl;
if(compare(ans, c))
cout << "Case #" << i << ": true" << endl;
else
cout << "Case #" << i << ": false" << endl;
}
return 0;
}