您的位置:首页 > 其它

UVa 465 - Overflow

2012-06-17 20:01 387 查看
判断给出的两数字及其和或积是否在int范围内。int最大为0x7fffffff。数组存放数字,在比较。

代码如下:

#include<stdio.h>
#include<string.h>

char s[2000], a[2000], b[2000], op[2];
int A[2000], B[2000], S[2000];

void judge()
{
long long a1, b1, s1;
sscanf(a, "%lld", &a1);
sscanf(b, "%lld", &b1);
sscanf(s, "%lld", &s1);
if(a1 > 0x7fffffff)
printf("first number too big\n");
if(b1 > 0x7fffffff)
printf("second number too big\n");
if(s1 > 0x7fffffff)
printf("result too big\n");
}

void mult()
{
int i, j;
memset(A, 0, sizeof(A));
memset(B, 0, sizeof(B));
memset(S, 0, sizeof(S));
int len1=strlen(a);
for(i=0; i<len1; i++)
A[len1-1-i]=a[i]-'0';
int len2 = strlen(b);
for(j=0; j<len2; j++)
B[len2-1-j]=b[j]-'0';
for(i=0; i<=len2; i++)
{
int c=0;
for(j=0; j<=len1; j++)
{
S[i+j]+=B[i]*A[j]+c;
c=S[i+j]/10;
S[i+j]%=10;
}
}
for(i=2000; i>0; i--)
if(S[i]) break;
for(j=0; j<=i; j++)
s[j]=S[i-j]+'0';
s[i+1]='\0';
judge();
}
void sum()
{
int i, j, k;
memset(A, 0, sizeof(A));
memset(B, 0, sizeof(B));
memset(S, 0, sizeof(S));
int len1=strlen(a);
for(i=0; i<len1; i++)
A[len1-1-i]=a[i]-'0';
int len2=strlen(b);
for( j=0; j<len2; j++)
B[len2-1-j]=b[j]-'0';
int t;
if(len1>len2) t=len1;
else t=len2;
int c=0;
for(k=0; k<=t; k++)
{
S[k]=A[k]+B[k]+c;
c=S[k]/10;
S[k]%=10;
}
for(i=2000; i>0; i--)
if(S[i]) break;
for(j=0; j<=i; j++)
s[j]=S[i-j]+'0';
s[i+1]='\0';
judge();
}

int main()
{
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
while(scanf("%s%s%s%*c", a, op, b)==3)
{
printf("%s %s %s\n",a,op,b);
if (op[0] == '+') sum();
else mult();
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: