465 - Overflow

#include <stdio.h>
#include <string.h>
#include<malloc.h>
int MaxInt[10]={2,1,4,7,4,8,3,6,4,7};


void tempAdd(int temp[],int product[])
{
 int i,c=0;
 for(i=0;i<=100;i++)
 {
  product[i]=product[i]+temp[i]+c;
  c=0;
  if(product[i]>9)
  {
   product[i]=product[i] %10;
   c=1;
  }
 }
}


int Compare(int num[],int n)
{
 int i,j=0,*temp=(int*)malloc(sizeof(int)*n);
 memcpy(temp,num,sizeof(int)*n);
 for(i=0;i<10;i++)
  temp[i]=num[i]-MaxInt[9-i];
 for(i=n-1;i>=0;i--)
 {
  if(temp[i]!=0)
  {
   j=i; break;
  }
 }
 i=temp[j];
 free(temp);
 if(i>0) return 1;
 else return -1;
}


int main()
{
 inti,j,num1[1000],num2[1000],sum[20],temp[100],prod[100],len1,len2,c=0,n,flag=0;
 char oper,p1[1000],p2[1000];
 while(scanf("%s %c%s",p1,&oper,p2)==3)
 {
  printf("%s %c %s\n",p1,oper,p2);
  memset(num1,0,sizeof(num1));
  memset(num2,0,sizeof(num2));
  memset(sum,0,sizeof(sum));
  memset(temp,0,sizeof(temp));
  memset(prod,0,sizeof(prod));
  len1=strlen(p1);
  len2=strlen(p2);
  for(i=0;i<len1;i++)
  num1[len1-i-1]=(p1[i]-'0');
  for(i=0;i<len2;i++)
  num2[len2-i-1]=(p2[i]-'0');
  for(i=0;i<len1;i++)if(p1[i]!='0') {len1=len1-i; break;}
  if(i==len1) len1=1;
  for(i=0;i<len2;i++)if(p2[i]!='0') {len2=len2-i; break;}
  if(i==len2) len2=1;
  if(len1>10)
  {
   printf("first number toobig\n");
   flag=1;
  }
  else if(Compare(num1,10)>0)
  {
   printf("first number toobig\n");
   flag=1;
  }
  if(len2>10)
  {
   printf("second number toobig\n");
   flag=1;
  }
  else if(Compare(num2,10)>0)
  {
   printf("second number toobig\n");
   flag=1;
  }
  if(flag==1)
  {
   flag=0;
   if(!(oper=='*'&& ((len1==1&& num1[0]==0) || (len2==1&& num2[0]==0))))
   printf("result toobig\n");
   continue;
  }
  n=len1>=len2?len1:len2;
  if(oper=='+')
  {
  for(i=0;i<n+1;i++)
   {
   sum[i]=num1[i]+num2[i]+c;
    c=0;
   if(sum[i]>9)
    {
    sum[i]=sum[i] % 10;
    c=1;
    }
   }
  if(Compare(sum,11)>0)
   {
   printf("result too big\n");
   }
  }
  else
  {
  for(j=0;j<len2;j++)
   {
   for(i=0;i<=len1;i++)
    {
    temp[i+j]=num2[j]*num1[i]+c;
    c=0;
    if(temp[i+j]>9)
    {
     c=temp[i+j]/10;
     temp[i+j]=temp[i+j] % 10;
    }
    }
   tempAdd(temp,prod);
   memset(temp,0,sizeof(temp));
   }
  if(Compare(prod,100)>0)
   {
   printf("result too big\n");
   }
  }
 }
 return 0;
}
找出所有Bug後還是WR了n次,最後發現竟是數組開的不夠大,真是無語

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章