题目
思路:
一开始想法是用大整数运算。但没学过负数的大整数运算,导致答案不正确。代码如下
#include <bits/stdc++.h>
using namespace std;
struct bign{
int a[100];
int len;
bign(){
memset(a,0,sizeof(a));
len=0;
}
};
bign change(char str[]){
bign r;
r.len=strlen(str);
for(int i=0;i<r.len;i++){
r.a[i]=str[r.len-1-i]-'0';
}
return r;
}
bool compare(bign c,bign d){
if(c.len>d.len) return true;
else if(c.len<d.len) return false;
else{
for(int i=c.len-1;i>=0;i--){
if(c.a[i] >d.a[i]) return 1;
else if(c.a[i] < d.a[i]) return 0;
}
}
return false;//当两数完全相同,返回0;
}
bign add(bign a,bign b){
bign c;
int carry=0; //关键在于进位
for(int i=0;i<a.len || i<b.len;i++){ //以较长的为界限
int temp=a.a[i] + a.a[i] + carry;
c.a[c.len++] = temp %10;
carry = temp / 10;
}
if(carry!=0){
c.a[c.len++] = carry; //如果最后进位不为0,将进位赋给最高位
}
return c;
}
int main (){
int n;
cin>>n;
for(int i=1;i<=n;i++){
char t1[100],t2[100],t3[100];
cin>>t1>>t2>>t3;
bign k4,k1=change(t1),k2=change(t2),k3=change(t3);
k4=add(k1,k2);
if(compare(k4,k3)==1) cout<<"Case #"<<i<<": true"<<endl;
else cout<<"Case #"<<i<<": false"<<endl;
}
}
- 问题是题目要求的数据范围并不需要大整数,longlong即可。这就是15分的送分题,怎么可能会考大整数呢,嗐。
类型 | 字节数 | 取值范围 |
---|---|---|
int | 2 | - 32768 ~ 32767 (5位十进制数) |
int | 4 | - 2147483648 ~ 2147483647 (10位十进制数) |
unsignde int | 2 | 0 ~ 65535 (5位十进制数) |
unsignde int | 4 | 0 ~ 4294967295 (10位十进制数) |
short | 2 | - 32768 ~ 32767 (5位十进制数) |
unsigned short | 2 | 0 ~ 65535 (5位十进制数) |
long | 4 | - 2147483648 ~ 2147483647 (10位十进制数) |
usigned long | 4 | 0 ~ 4294967295 (10位十进制数) |
long long | 8 | - 9223372036854775808 ~ 9223372036854775807(20位十进制数)(-2^63~2^63-1) |
unsigned long long | 8 | 0 ~ 18446744073709551615 (20位十进制数) |
题目所求范围用long long可以涵盖。
AC代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
long long a,b,c;
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a>>b>>c;
if(a+b>c) cout<<"Case #"<<i<<": true"<<endl;
else cout<<"Case #"<<i<<": false"<<endl;
}
}