UVA465-溢出
2012-08-19 14:51
134 查看
#include <iostream>
#include <cstdlib>
using namespace std;
int main ()
{
char a[3000], b[3000];
char ch;
long long int max = 2147483647;
while(cin>>a)
{
cin.get();
cin>>ch;
cin>>b;
cin.get();
cout<<a<<" "<<ch<<" "<<b<<endl;
double c = atof(a);
double d = atof(b);
double result;
if(c>max)cout<<"first number too big"<<endl;
if(d>max)cout<<"second number too big"<<endl;
if(ch == '+')result = c + d;
else result = c * d;
if(result>max)cout<<"result too big"<<endl;
}
return 0;
}
方法一真狗血啊,我只用了一个#clude<cstdlib>里的stof()函数就轻松解决了,不过收获不大,还需要寻找另一种方法!!!
记住:这个题的最大值max只能设为2147483647不能设为65535.
比较赞同的方法,缺点耗时,优点,简单易懂
#include <stdio.h>
#include <string.h>
const int Int[11]={2,1,4,7,4,8,3,6,4,7};
char *s1="first number too big",*s2="second number too big",*s3="result too big";
char exp[10010]={'\0'},opr;
int a[510]={0},b[510]={0},la,lb;
bool Bignum(int *a,int la)
{
if(la>10) return true;
else if(la<10) return false;
for(int i=0;i<10;i++)
if(a[i]>Int[i]) return true;
else if(a[i]<Int[i]) return false;
return false;
}
int Delzero(int *a,int la)
{
while(!a[la-1]&&la-1) la--;
return la;
}
void Change(int *a,int la)
{
int t;
for(int i=0;i<la-i-i;i++)
{ t=a[i]; a[i]=a[la-1-i]; a[la-1-i]=t; }
}
void Plus(int *a,int *b,int la)
{
for(int i=0;i<la;i++)
{
a[i]+=b[i];
if(a[i]>=10)
{
a[i+1]++;
a[i]%=10;
}
}
if(a[la]) la++;
la=Delzero(a,la);
Change(a,la);
if(Bignum(a,la)) printf("%s\n",s3);
}
void Mult(int *a,int *b,int la,int lb)
{
int c[510]={0};
for(int i=0;i<la;i++)
for(int j=0;j<lb;j++)
{
c[i+j]+=a[i]*b[j];
if(c[i+j]>=10)
{
c[i+j+1]+=c[i+j]/10;
c[i+j]%=10;
}
}
la+=lb;
la=Delzero(c,la);
Change(c,la);
if(Bignum(c,la)) printf("%s\n",s3);
}
int main()
{
bool t;
while(gets(exp)!=NULL)
{
t=true;la=lb=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
puts(exp);
for(int i=0;i<strlen(exp);i++)
if(exp[i]==' '||exp[i]=='*'||exp[i]=='+')
{
if(exp[i]=='*'||exp[i]=='+') opr=exp[i];
t=false;
}
else
{
if(t) a[la++]=exp[i]-'0';
else b[lb++]=exp[i]-'0';
}
Change(a,la); la=Delzero(a,la); Change(a,la);
Change(b,lb); lb=Delzero(b,lb); Change(b,lb);
if(Bignum(a,la)) printf("%s\n",s1);
if(Bignum(b,lb)) printf("%s\n",s2);
Change(a,la); Change(b,lb);
if(opr=='+') Plus(a,b,la>lb?la:lb);
else Mult(a,b,la,lb);
}
return 0;
}
#include <cstdlib>
using namespace std;
int main ()
{
char a[3000], b[3000];
char ch;
long long int max = 2147483647;
while(cin>>a)
{
cin.get();
cin>>ch;
cin>>b;
cin.get();
cout<<a<<" "<<ch<<" "<<b<<endl;
double c = atof(a);
double d = atof(b);
double result;
if(c>max)cout<<"first number too big"<<endl;
if(d>max)cout<<"second number too big"<<endl;
if(ch == '+')result = c + d;
else result = c * d;
if(result>max)cout<<"result too big"<<endl;
}
return 0;
}
方法一真狗血啊,我只用了一个#clude<cstdlib>里的stof()函数就轻松解决了,不过收获不大,还需要寻找另一种方法!!!
记住:这个题的最大值max只能设为2147483647不能设为65535.
比较赞同的方法,缺点耗时,优点,简单易懂
#include <stdio.h>
#include <string.h>
const int Int[11]={2,1,4,7,4,8,3,6,4,7};
char *s1="first number too big",*s2="second number too big",*s3="result too big";
char exp[10010]={'\0'},opr;
int a[510]={0},b[510]={0},la,lb;
bool Bignum(int *a,int la)
{
if(la>10) return true;
else if(la<10) return false;
for(int i=0;i<10;i++)
if(a[i]>Int[i]) return true;
else if(a[i]<Int[i]) return false;
return false;
}
int Delzero(int *a,int la)
{
while(!a[la-1]&&la-1) la--;
return la;
}
void Change(int *a,int la)
{
int t;
for(int i=0;i<la-i-i;i++)
{ t=a[i]; a[i]=a[la-1-i]; a[la-1-i]=t; }
}
void Plus(int *a,int *b,int la)
{
for(int i=0;i<la;i++)
{
a[i]+=b[i];
if(a[i]>=10)
{
a[i+1]++;
a[i]%=10;
}
}
if(a[la]) la++;
la=Delzero(a,la);
Change(a,la);
if(Bignum(a,la)) printf("%s\n",s3);
}
void Mult(int *a,int *b,int la,int lb)
{
int c[510]={0};
for(int i=0;i<la;i++)
for(int j=0;j<lb;j++)
{
c[i+j]+=a[i]*b[j];
if(c[i+j]>=10)
{
c[i+j+1]+=c[i+j]/10;
c[i+j]%=10;
}
}
la+=lb;
la=Delzero(c,la);
Change(c,la);
if(Bignum(c,la)) printf("%s\n",s3);
}
int main()
{
bool t;
while(gets(exp)!=NULL)
{
t=true;la=lb=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
puts(exp);
for(int i=0;i<strlen(exp);i++)
if(exp[i]==' '||exp[i]=='*'||exp[i]=='+')
{
if(exp[i]=='*'||exp[i]=='+') opr=exp[i];
t=false;
}
else
{
if(t) a[la++]=exp[i]-'0';
else b[lb++]=exp[i]-'0';
}
Change(a,la); la=Delzero(a,la); Change(a,la);
Change(b,lb); lb=Delzero(b,lb); Change(b,lb);
if(Bignum(a,la)) printf("%s\n",s1);
if(Bignum(b,lb)) printf("%s\n",s2);
Change(a,la); Change(b,lb);
if(opr=='+') Plus(a,b,la>lb?la:lb);
else Mult(a,b,la,lb);
}
return 0;
}
相关文章推荐
- △UVA465 - Overflow(判断大数相加相乘是否会溢出)
- UVa 465 溢出
- UVA 465 溢出
- UVa 465 溢出
- UVA 465 Overflow
- UVA 465
- ACM->uva465
- UVA_465_Overflow
- UVA - 465 Overflow
- UVA 465 (暑假-高精度 -B - Overflow)
- UVA 465
- uva465 overflow
- uva 465 - Overflow
- UVA 465 Overflow(浮点数的范围)
- UVA 465 - Overflow (浮点数的优势)
- uva 465
- UVA 465 (13.08.02)
- UVa 465 - Overflow
- UVa - 465 - Overflow
- uva 465 Overflow 还是高精度。。。