PAT A1065 A+B and C (64bit)
Sample Input:
3
1 2 3
2 3 4
9223372036854775807 -9223372036854775808 0
Sample Output:
Case #1: false
Case #2: true
Case #3: false
-
思路1:
long long的表示范围为[-263,263),a,b符号相反时,结果一定不会溢出,可以直接与c比较,同号时,正溢出一定比c大,负溢出一定比c小 -
code1:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int n;
ll a, b, c;
scanf("%d", &n);
for(int i = 1; i <= n; ++i){
string flag;
scanf("%lld %lld %lld", &a, &b, &c);
ll ans = a + b; //Wrong 1: 必须先用ans存储结果,否则无法判断溢出
if(a > 0 && b > 0 && ans < 0) flag = "true"; //正溢出
else if(a < 0 && b < 0 && ans >= 0) flag = "false"; //负溢出
else flag = (ans > c ? "true" : "false");
printf("Case #%d: %s\n", i, flag.c_str());
}
return 0;
}
- T3 code:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
bool Judge(ll a, ll b, ll c)
{
ll ans = a + b; //必须用ans 先求出a+b!
if(a > 0 && b > 0 && ans < 0)
{ //正溢出
return true;
}else if(a < 0 && b < 0 && ans >= 0)
{ //负溢出:可能为0!!!
return false;
}else return ans > c ? true : false;
}
int main()
{
int n;
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
{
ll a, b, c;
scanf("%lld %lld %lld", &a, &b, &c);
printf("Case #%d: %s\n", i, Judge(a, b, c) ? "true" : "false");
}
return 0;
}
- T4 code: 思路4 大整数加法
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct bign
{
int num[110];
int len;
bool sign; // false == 1, true == -1
bign(){
len = 0;
sign = false;
memset(num, 0, sizeof(num));
}
};
int BignCmp(bign a, bign b)
{
if(a.sign == true && b.sign == false) return -1;
else if(a.sign == false && b.sign == true) return 1;
int tmp = a.sign == true ? -1 : 1;
if(a.len > b.len)
{
return 1 * tmp;
}else if(a.len < b.len)
{
return -1 * tmp;
}else
{
for(int i = a.len-1; i >= 0; --i)
{
if(a.num[i] > b.num[i]) return 1 * tmp;
else if(a.num[i] < b.num[i]) return -1 * tmp;
}
return 0;
}
}
bign Change(string s)
{
bign ans;
if(s[0] == '-')
{
ans.sign = true;
s.erase(0, 1);
}
ans.len = s.size();
for(int i = 0; i < s.size(); ++i)
{
ans.num[i] = s[s.size()-1-i] - '0';
}
return ans;
}
bign Add(bign a, bign b)
{
bign ans;
if(a.sign == true && b.sign == true) ans.sign = true; //负数相加结果为负
int carry = 0;
for(int i = 0; i < a.len || i < b.len; ++i)
{
int tmp = a.num[i] + b.num[i] + carry;
ans.num[ans.len++] = tmp % 10;
carry = tmp / 10;
}
if(carry != 0) ans.num[ans.len++] = carry;
return ans;
}
int main()
{
int n;
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
{
ll a, b, c;
scanf("%lld %lld %lld", &a, &b, &c);
printf("Case #%d: ", i);
if(a < 0 && b < 0 || a > 0 && b > 0)
{
bign tmpa = Change(to_string(a)), tmpb = Change(to_string(b)), tmpc = Change(to_string(c));
bign ans = Add(tmpa, tmpb);
printf("%s\n", BignCmp(ans, tmpc) > 0 ? "true" : "false");
}else
{
ll ans = a + b;
printf("%s\n", ans > c ? "true" : "false");
}
}
return 0;
}