PAT甲级1065 A+B and C

题目:
给定三个整数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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值