2014年10月1日星期三

[UVa] 465 - Overflow

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cstdio>
#include <cstring>
#include <iostream>

#define maxn 1000 
// E.X. max of int is 2147483647


using namespace std;

// print
void print(int a[maxn]){
  int i=maxn-1;       // 要印的數字位置
  while(i>=0 && a[i]==0) i--; // 數字開頭的零都不印
  if(i<0)cout << '0';
  else while(i>=0) cout << a[i--]; 
}

// a > b  or  a < b
int compare(int a[maxn], int b[maxn]) 
{
  for (int i=maxn-1; i>=0; i--)    // 從高位數開始比,對應的位數相比較。
    if (a[i] != b[i] && a[i] > b[i]){       // 發現 a b 不一樣大,馬上回傳結果。
   return 1; // 1 = a>b
 }
 else if (a[i] != b[i] && a[i] < b[i]){
   return 2; // 2 = a<b
 }
    return false;       // 完全相等
}

// c = a + b;
void add(int a[maxn], int b[maxn], int c[maxn])
{
  for (int i=0; i<maxn; i++)   // 對應的位數相加
    c[i] = a[i] + b[i];
            
  for (int i=0; i<maxn-1; i++) // 一口氣進位
  {
    c[i+1] += c[i] / 10;    // 進位
    c[i] %= 10;             // 進位後餘下的數
  }
}

// c = a * b;
void mul(int a[maxn], int b[maxn], int c[maxn])
{
  for (int i=0; i<maxn; i++)
    c[i] = 0;
     
    for (int i=0; i<maxn; i++)
      for (int j=0; j<maxn; j++)
        if (i+j < maxn)
          c[i+j] += a[i] * b[j];
                    
    for (int i=0; i<maxn-1; i++) // 一口氣進位
    {
      c[i+1] += c[i] / 10;
      c[i] %= 10;
    }
}


char max_int[maxn] = "2147483647";
char input_a[maxn]={'\0'};
char op1,op2,op3;
char input_b[maxn]={'\0'};
int a[maxn],b[maxn],intmax[maxn],result[maxn];

int main(){
  for(int i=0;i<maxn;i++)a[i]=0;
  for(int i=0;i<maxn;i++)b[i]=0;

  while(scanf("%s",&input_a)!=EOF){
      scanf("%c%c%c",&op1,&op2,&op3);
   scanf("%s",&input_b);
   printf("%s %c %s\n",input_a,op2,input_b);
   
   
   //change input into integer array
   int len = strlen(input_a);
      for(int i=0;i<len;i++){
     a[i]=input_a[len-i-1]-48;
   }
   
   len = strlen(input_b);
   for(int i=0;i<len;i++){
     b[i]=input_b[len-i-1]-48; 
   }
   
   len = strlen(max_int);
      for(int i=0;i<len;i++){
     intmax[i]=max_int[len-i-1]-48; 
   }

   
   
   int cmp_a = compare(a,intmax);
   if(cmp_a==1)printf("first number too big\n");
 
   int cmp_b = compare(b,intmax);
   if(cmp_b==1)printf("second number too big\n");

   if(op2=='+')add(a,b,result);
   if(op2=='*')mul(a,b,result);   
   
   int cmp_result = compare(result,intmax);
   if(cmp_result==1)printf("result too big\n");
   
   memset(a,0,sizeof(a));
   memset(b,0,sizeof(b));
   memset(result,0,sizeof(result));
  }

  return 0;  
} 

沒有留言: