题目:
给定三个整数A,B和C在[−263,263]范围内, 求A+B>C是否成立。
输入格式:
输入的第一行给出了测试用例的正数T(≤10). 接着是T行测试用例,每个测试用例由一行组成,其中包含三个整数A、B和C,用单个空格隔开。
输出格式:
对于每个测试用例,如果A+B>C,则输出一行case #X: true
,否则输出case #X: false
,其中X是用例号(从1开始)。
输入样例:
3
1 2 3
2 3 4
9223372036854775807 -9223372036854775808 0
输出样例:
Case #1: false
Case #2: true
Case #3: false
注意点:
严格按题目要求的话应该用大数相加方法。测试点没有取到263,故可以用long long型。a+b的结果需要先存放在一个对象中再和c比较,否则测试点1、2错误(原因待学习)。输入使用cin,测试点2死活过不去(原因待学习),需要使用scanf输入。
AC代码:
(解法1:判断溢出)
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
long long a,b,add,c;
for(int i=1;i<=n;i++){
//cin>>a>>b>>c;
scanf("%lld %lld %lld",&a,&b,&c);
add=a+b;
if(a>0&&b>0&&add<0){
printf("Case #%d: true\n",i);
}
else if(a<0&&b<0&&add>=0){
printf("Case #%d: false\n",i);
}
else if(add>c){
printf("Case #%d: true\n",i);
}
else{
printf("Case #%d: false\n",i);
}
}
return 0;
}
(解法2:大数相加减)绝了怎么能写这么多行,去学习一下大数加减的模板简化一下
#include<iostream>
#include<string.h>
#include<vector>
#include<stdlib.h>
using namespace std;
vector<char> a,b,c,ans,t;
vector<char>::iterator it;
int tag=1;//最终结果正负
bool cmp(vector<char> a,vector<char> b){
if(a[0]=='-'&&b[0]!='-') return false;//b正a负
else if(a[0]!='-'&&b[0]=='-') return true;//a正b负
else{//同为正或同为负
if(a.size()==b.size()){//位数一样
if(a[0]=='-'){//负数
if(a<b) return true;
else return false;
}
else{
if(a>b) return true;
else return false;
}
}
else if(a.size()>b.size()){//a位数大于b
if(a[0]!='-')
return true;
else
return false;
}
else{
if(a[0]!='-')
return false;//a位数小于b
else return true;
}
}
}
void reverse(vector<char> &x){//逆置
char t;
int k=x.size();
for(int i=0;i<k/2;i++){
t=x[i];
x[i]=x[k-i-1];
x[k-i-1]=t;
}
}
void sub(vector<char> a,vector<char> b){//减法
int i=a.size()-1,j=b.size()-1,carry=0,temp=0;//carry为借位
int x,y;
char num;
while(i>=0||j>=0){
if(i>=0) x=a[i]-'0';
else x=0;
if(j>=0) y=b[j]-'0';
else y=0;
temp=carry+x-y;
if(temp<0){
num=(char)(temp+10);
ans.push_back(num);
carry=-1;
}
else{
ans.push_back(temp+'0');
carry=0;
}
i--;
j--;
}
it=ans.end()-1;
while(*it=='0'){
it--;
ans.pop_back();
}
if(tag==-1){
ans.push_back('-');
}
reverse(ans);
}
void add(vector<char> a,vector<char> b){//加法
int i=a.size()-1,j=b.size()-1,carry=0,temp=0;//carry为进位
int x,y,borden=0;
if(a[0]=='-'){//负数符号位不处理
borden=1;
}
while(i>=borden||j>=borden||carry==1){//两个中最长位数走完以及没有进位时才计算完毕
if(i>=borden) x=a[i]-'0';
else x=0;
if(j>=borden) y=b[j]-'0';
else y=0;
temp=carry+x+y;
if(temp>=10){//需要进位
ans.push_back((temp%10)+'0');
carry=1;
}
else{
ans.push_back(temp+'0');
carry=0;
}
i--;
j--;
}
if(a[0]=='-'){
ans.push_back('-');
}
reverse(ans);//逆置转化为正常顺序
}
int main(){
int n;
cin>>n;
getchar();
for(int i=1;i<=n;i++){
a.clear();
b.clear();
c.clear();
ans.clear();
char ar;
while((ar=getchar())!=' '){
a.push_back(ar);
}
while((ar=getchar())!=' '){
b.push_back(ar);
}
while((ar=getchar())!='\n'&&ar!=' '){
c.push_back(ar);
}
if(a[0]!='-'&&b[0]=='-'){//a正b负
b.erase(b.begin());//删除负号
if(!cmp(a,b)){//a小于等于b,最终结果为负数
swap(a,b);
tag=-1;
}
sub(a,b);
}
else if(a[0]=='-'&&b[0]!='-'){//a负b正
a.erase(a.begin());
if(!cmp(a,b)){//a小于等于b,最终结果为正数
swap(a,b);
tag=1;
}
else{
tag=-1;
}
sub(a,b);
}
else{
add(a,b);//同正负
}
if(cmp(ans,c)) printf("Case #%d: true\n",i);
else printf("Case #%d: false\n",i);
}
return 0;
}