题目大意:给出两个非负整数和运算符,判断非负整数和运算结果是否越界,C中以int为界,最大值2147483647
解题过程:Runtime Error 2次,WA无数次。。在判断加法时没什么陷阱,在判断乘法时,要考虑到一个因数为0时,即使另一个因数越界,结果也不会越界,还有一个考虑不周的地方就是要去掉前导0,坑爹。。。
正确代码:
# include <cstdio>
# include <cstdlib>
# include <ctime>
# include <cmath>
# include <iostream>
# include <fstream>
# include <cstring>
# include <string>
//*
#define fin cin
#define fout cout
//*/
# define maxn 10
using namespace std;
/*
ifstream fin("in.txt");
ofstream fout("out.txt");
//*/
struct bign{
int len,s[maxn];
bool islarge;
bign(){
len=1;
memset(s,0,sizeof(s));
islarge=false;
}
bign operator = (const char * num) {
len=strlen(num);
for(int i=0;i<len;i++){
s[i]=num[len-1-i]-'0';
}
return *this;
}
bign operator = (int num) {
char s[maxn];
sprintf(s,"%d",num);
*this=s;
return *this;
}
bign(const char * num){
*this=num;
}
bign(int num){
*this=num;
}
int toInt(){
int x=0;
for(int i=0;i<len;i++){
x+=s[i]*(int)pow(10,i);
}
return x;
}
};
int judge(bign a,bign b){
if(a.len>b.len) return 1;
if(b.len>a.len) return -1;
for(int i=a.len-1;i>=0;i--){
if(a.s[i]>b.s[i]) return 1;
if(a.s[i]<b.s[i]) return -1;
}
return 0;
}
int main()
{
string s1,s2;
char op;
bign max=2147483647,a,b;
bool isa=false,isb=false,isres=false;
int ai,bi,maxi=2147483647;
while(fin>>s1>>op>>s2){
fout<<s1<<" "<<op<<" "<<s2;
char temp[20];
int i,j,k;
k=s1.length();
for(i=0;i<k;i++){
if(s1[i]!='0') break;
}
for(j=0;i<min(20,k);i++,j++){
temp[j]=s1[i];
}
temp[j]='\0';
s1=temp;
k=s2.length();
for(i=0;i<k;i++){
if(s2[i]!='0') break;
}
for(j=0;i<min(20,k);i++,j++){
temp[j]=s2[i];
}
temp[j]='\0';
s2=temp;
if(s1.length()>maxn) {
isa=true;
ai=maxi;
}
else{
a=s1.c_str();
if(judge(a,max)==1) {
isa=true;
ai=maxi;
}
else {
isa=false;
ai=a.toInt();
}
}
if(s2.length()>maxn) {
isb=true;
bi=maxi;
}
else{
b=s2.c_str();
if(judge(b,max)==1) {
isb=true;
bi=maxi;
}
else {
isb=false;
bi=b.toInt();
}
}
if(op=='+'){
if(isa||isb||ai>maxi-bi) isres=true;
else isres=false;
}
else{
if(ai==0||bi==0) isres=false;
else if(isa||isb) isres=true;
else if(maxi/ai/bi<1) isres=true;
else isres=false;
}
if(!isa&&!isb&&!isres) fout<<endl;
else {
fout<<endl;
if(isa) fout<<"first number too big"<<endl;
if(isb) fout<<"second number too big"<<endl;
if(isres) fout<<"result too big"<<endl;
}
}
return 0;
}