没想到是这样简单的方式,以为考察高精度加减法呢,不过就一个20分的题,估计也不是
溢出的判断方法激:上溢必定是两个正数相加,结果超过INT_MAX,导致结果变成负数或零。下溢同理(或0)。
C++ 代码
#include<iostream>
using namespace std;
long long a,b,c,d,n,k=1;
int main(){
cin>>n;
while(n--){
cin>>a>>b>>c;
d=a+b;
if(a>0&&b>0&&d<=0) printf("Case #%lld: true\n",k++);
else if(a<0&&b<0&&d>=0) printf("Case #%lld: false\n",k++);
else if(a+b>c){
printf("Case #%lld: true\n",k++);
}
else{
printf("Case #%lld: false\n",k++);
}
}
}
/***
//高精度相加和比较,没写出来,放在这里,之后再试试
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int N=1e5+10;
vector<int> add(vector<int>&a,vector<int>&b,int n,int m){
vector<int>res;
int t=0;
for(int i=0;i<n||i<m||t;i++){
if(i<n) t+=a[i];
if(i<m) t+=b[i];
res.push_back(t%10);
t/=10;
}
// 别忘了反转
reverse(res.begin(),res.end());
return res;
}
vector<int> sub(vector<int>&a,vector<int>&b,int n,int m){
vector<int>res;
if(n<m){
res=sub(b,a,m,n);
return res;
}
else if(n==m){
for(int i=n-1;i>=0;i--){
if(a[i]<b[i]) return sub(b,a,m,n);
else if(a[i]>b[i]) return sub(a,b,n,m);
}
return res;
}
//n>=m;
int t=0;
for(int i=0;i<n;i++){
t+=a[i];
if(i<m) t-=b[i];
res.push_back((t+10)%10);
if(t<0) t=-1;
else t=0;
}
//去前导零
for(int i:res){
if(i==0) res.pop_back();
else break;
}
reverse(res.begin(),res.end());
return res;
}
int main(){
int k,n,m;
cin>>k;
bool flag=false;
vector<int>a;
vector<int>b;
vector<int>res;
string sa,sb,sc;
int zer=0;
while(k--){
cin>>sa>>sb>>sc;
n=sa.size(),m=sb.size();
for(int i=n-1;i>=0;i--) {
if(i==0&&!isdigit(sa[i])) {
n--;
continue;
}
a.push_back(sa[i]-'0');
}
for(int i=m-1;i>=0;i--) {
if(i==0&&!isdigit(sb[i])) {
m--;
continue;
}
b.push_back(sb[i]-'0');
}
if(sa[0]=='-'&&sb[0]=='-'){
if(sc[0]!='-') {
cout<<"true"<<endl;
continue;
}
res=add(a,b,n,m);
if(res.size()>sc.size()){
cout<<"false"<<endl;
}
else if(res.size()<sc.size())cout<<"true"<<endl;
else{
for(int i=0;i<sc.size();i++){
if(sc[i]>res[i]){
cout<<"false"<<endl;
break;
}
else if(sc[i]<res[i]){
cout<<"true"<<endl;
break;
}
}
cout<<"true"<<endl;
}
}
..........
}
}
***/