Fork me on GitHub

Uva 465 - Overflow

 Overflow 

Time limit: 3.000 seconds

Write a program that reads an expression consisting of two non-negative integer and an operator. Determine if either integer or the result of the expression is too large to be represented as a ``normal'' signed integer (type integer if you are working Pascal, type int if you are working in C).

Input

An unspecified number of lines. Each line will contain an integer, one of the two operators + or *, and another integer.

Output

For each line of input, print the input followed by 0-3 lines containing as many of these three messages as are appropriate: ``first number too big'', ``second number too big'', ``result too big''.

Sample Input

300 + 3
9999999999999999999999 + 11

Sample Output

300 + 3
9999999999999999999999 + 11
first number too big
result too big


复制代码
#include<stdio.h>  
#include<stdlib.h>  
#define max 2147483647  
int main()  
{  
    char s1[10001],s2[10001],c;  
    double x,y;  
    while(scanf("%s %c %s",s1,&c,s2)!=EOF)  
    {  
          
        printf("%s %c %s\n",s1,c,s2);  
        x=atof(s1);  
        y=atof(s2);  
        if(x>max)printf("first number too big\n");  
        if(y>max)printf("second number too big\n");  
        if(c=='+'&&x+y>max)printf("result too big\n");  
        if(c=='*'&&x*y>max)printf("result too big\n");  
    }  
    return 0;  
} 
复制代码

//代码来自百度搜索
搁置代码:

复制代码
View Code
#include<stdio.h>
#include<string.h>
int is_plus(int jlen, int ilen, int sum[], char inter[], char jnter[])
{
    int i, j, t, loop, temp, e = 0 ;
    for(j=jlen-1; j>=0; --j)
        {
            loop = jlen-1-j;
            for(i=ilen-1; i>=0; --i, ++loop)
            {
                temp = sum[loop];
                sum[loop] = (e+sum[loop]+(inter[i]-'0')*(jnter[j]-'0'))%10;
                e = (e+temp+(inter[i]-'0')*(jnter[j]-'0'))/10;
            }
            for(t=loop; t<1004 && e; ++t)
            {
            temp = sum[t];
            sum[t] = (e + sum[t])%10;
            e = (e + temp)/10;
            } 
        }
 return 0;
}

int is_add(int jlen, int ilen, int sum[], char inter[], char jnter[])
{
    int len, j, i, e = 0, temp;
    len = ilen < jlen ? ilen:jlen;
    for(i=0; i<len; ++i)
        {
            temp = sum[i];
            sum[i] = (e + sum[i] + (inter[len-i-1]-'0') + (jnter[jlen-i-1]-'0'))%10;
            e = (e + temp + (inter[len-i-1]-'0') + (jnter[jlen-i-1]-'0'))/10;
        }
   if(ilen-len>0) 
   for(j=i; j<ilen; ++j) 
     {
            temp = sum[j];
            sum[j] = (e + sum[j] + (inter[j]-'0'))%10;
            e = (e + temp +(inter[j]-'0'))/10;
        }   
        
   else if(jlen-len>0)
  for(j=i; j<jlen; ++j) 
     {
            temp = sum[j];
            sum[j] = (e + sum[j] + (jnter[j]-'0'))%10;
            e = (e + temp +(jnter[j]-'0'))/10;
        } 
        for(j=i; j<1004 && e; ++j)
        {
            temp = sum[j];
            sum[j] = (e + sum[j])%10;
            e = (e + temp)/10;
        }
  return 0;
}



int main()
{

   int i, j, ilen, jlen, sum[1004], fflag, t, temp;
   char cali[502], calj[502], calij[502], flag, *judge="7463847412";
   memset(sum, 0, sizeof(sum));
   memset(cali, 0, sizeof(cali));
   memset(calj, 0, sizeof(calj));
   memset(calij, 0, sizeof(calij));
   while(scanf("%s", calij) != EOF)
   {
         getchar();
         fflag = temp = 0;
         printf("%s", calij);
         ilen = strlen(calij);
         for(i=0; (calij[i]-'0' == 0)&&i<ilen-1; ++i);
         t = ilen;
         ilen = ilen - i;
         for(j=0; j<502&&i<t; ++i, ++j)
         {
           cali[j] = calij[i];     
      }
      memset(calij, 0, sizeof(calij));
         flag = getchar();
         getchar();
         printf(" %c ", flag);
         scanf("%s", calij);
         getchar();
         printf("%s\n", calij);
         jlen = strlen(calij);
         for(i=0; (calij[i]-'0' == 0)&&i<jlen-1; ++i);
         t = jlen;
         jlen = jlen - i;
         for(j=0; j<502&&i<t; ++i, ++j)
         {
           calj[j] = calij[i];     
      }
         if(ilen > 10){temp=1; printf("first number too big\n");}
         
         else if(ilen == 10)
         {
                 i = 0;
                 while(cali[i]-'0' == judge[9-i]-'0' && i<10) ++i;
            if(cali[i]-'0'>(judge[9-i]-'0')) printf("first number too big\n");
          
      }
      
         if(jlen > 10){temp=1; printf("second number too big\n");}
         else if(jlen == 10)
         {
          i = 0;
                 while(calj[i]-'0' == judge[9-i]-'0' && i<10) ++i;
            if(calj[i]-'0'>(judge[9-i]-'0')) printf("second number too big\n");    
      }
         
         
         
         switch(flag)
         {
           case '*':     is_plus(jlen, ilen, sum, cali, calj); break;
           case '+':  is_add(jlen, ilen, sum, cali, calj); break;
           default: return 1;
      }
      {
          for(i=1003; !sum[i]&& i>=9; --i);
          if(i>=10) printf("result too big\n");
          else if(i == 9)
        {
            while(sum[i] == judge[i]-'0' && i>0) --i;
            if(sum[i]>(judge[i]-'0')) printf("result too big\n");
          } 

      }
      memset(sum, 0, sizeof(sum));
      memset(cali, 0, sizeof(cali));
      memset(calj, 0, sizeof(calj));
      memset(calij, 0, sizeof(calij));
   }
   return 0;    
}
复制代码

融合之前Uva product 和 interger inquiry中的大数相乘和想加,本人代码调试两天,行数达到140行,无奈之下只能放弃,WA惨不忍睹,寻根问底只因为思维不够严谨,出现的失误和缺漏大致如下:1>当乘数(或加数)直接大于MAX_INT 时直接判断Result溢出而未考虑乘数为0的情况;2>判断数的大小出现问题,直接判断每位数的大小,汗颜!3>生搬硬套,误以为memset(buf, 0, sizeof(buf))将所有的buf[i]中的值赋为零,没想到却是'/0',导致加法出现问题,更不用说考虑时间复杂度;4>未考虑前缀为零的情况;5>开了分别定义为int型和char型的数组,进行比较大小时经常忘记-/+ '0',导致多次运行后数据出现错误;5>还有未知错误导致现在的WA状态,希望有一天有能力解决,孰轻孰重,希望我现在所做的不是错的

posted @   Gifur  阅读(349)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
TOP
点击右上角即可分享
微信分享提示