/*
-_-; 사실은 깝싼이유는...
별것도 아닌 문제겠지만.. 나한테는 꽤나 힘들었다는..
그래서 우월감? 이런 쓸대 없는 감정 없에게 그랬던거 였어 ㅋ
너네가 당근이 코드는 더 잘짜겠지... 그거보고 배우기도 하고 ㅋ
*/

#include<stdio.h>
#include<string.h>
#define CHARINT(x) x - 48
#define INTCHAR(x) x + 48
#define MAX(x,y)   x > y ? x : y
enum { NO_MORE = 0 , MORE , ERROR , NULLSPACE = 1};
int   check(char*,char*,int,int);
char* sum(char*,char*,char*,int,int,int,int);
int main()
{
   char  l[]    = \"9245245234524352345234999\";
   char  r[]    = \"1115234523452345234523452\";
   char* t      = NULL;
   int   bCheck = MORE;
   int   size   = 0;
   int l_len = strlen(l);
   int r_len = strlen(r);
   
   bCheck    = check(l,r,l_len - 1,r_len - 1);
   printf(\"you need %s memory!\\n\",bCheck == MORE ? \"more\" : \"no_more\"); // Testing printf !
   t         = (char*)malloc(size = bCheck + (MAX(l_len,r_len)) + NULLSPACE);
   printf(\"total memory size is %d\\n\",size);
   t[--size] = \'\\0\';
   printf(\"%s + %s = %s\\n\",l,r,sum(l,r,t,l_len - 1,r_len - 1,size -1,bCheck));
   free(t);
   return 0;
}
char* sum(char* l ,char* r,char* t,int l_len,int r_len,int t_len,int bCheck) // size is total\'s size
{
   int result = 0;
   int over   = 0;
   int i      = 0; 
   int idx    = 0;

   if ( l_len > r_len ) {
      while( t_len ) {
         result = CHARINT(l[l_len]) + CHARINT(r[r_len]) + over;
         if ( result < 10 && r_len > 0 ) { //더하는中 10보다 작을때.
            t[t_len] = INTCHAR(result);
         }
         else if ( result >= 10 && r_len > 0 ) {// 더하는中 10보다 클때
            over = 1; result -= 10;
            t[t_len] = INTCHAR(result);
         }
         else if ( result  < 10 && r_len == 0 ) { // 더했는데 10작을때
            t[t_len] = INTCHAR(result);
            for ( i = t_len - 1 ; i >= 0 ; i-- ) t[i] = l[i];
            break;
         }
         else if ( result >= 10 && r_len == 0 ) { // 더했는데 10보다 클때
              result -= 10;
            over    = 1;
            t[t_len] = INTCHAR(result);
            for ( i = t_len - 1  ; i >= 0 ; i-- ) {
                 result = CHARINT(l[i]) + over;
                 if ( result < 10 ) {
                    over = 0;
                    t[i] = INTCHAR(result);
                 }
                 else if ( result >= 10 ) {
                    over = 1; result -= 10;
                    t[i] = INTCHAR(result);
                 }
            }
            if ( bCheck == MORE ) t[0] = INTCHAR(over);
            break;
         }
       t_len--;
       r_len--;
       l_len--;
      } 
   }
   else if ( l_len == r_len ) {
      idx = l_len;   
 
      while ( idx >= 0 ) {
         result = CHARINT(l[idx]) + CHARINT(r[idx]) + over;
        
         if ( result < 10  && idx >= 0 ) {
            t[t_len] = INTCHAR(result);
         }
         else if ( result >= 10 && idx >= 0 ) {
            over = 1;  result -= 10;
            t[t_len] = INTCHAR(result);
         }
         t_len--;
         idx--;
      }
      if ( bCheck == MORE ) t[0] = INTCHAR(over);
   }
  
   return t;
}
int check(char* l, char* r,int l_len, int r_len)
{
   int i      = 0;
   int result = 0; 
   int over   = 0;         // 변수 : over는 같은 자릿수 계산에 이용.
  
   int more_long  = 0;
   int more_short = 0;
   int same_len   = 0;

   if ( l_len > r_len ) { // 한쪽이 더 긴경우.
      more_long  = l_len;
      more_short = r_len;
    
     while ( more_long ) {
       result = CHARINT(l[more_long]) + CHARINT(r[more_short]);    
       if ( result < 10 && more_short == 0 ){ // 다 더했는데 10보다 작을때.
           return NO_MORE;
       }
       else if ( result >= 10 && more_short == 0 ){ // 다 더했는데 10보다 클때.
           if ( more_long == more_short ) return MORE;
           if ( CHARINT(l[more_long - 1]) < 9 ){     // 더 긴수의 담자리가 9보다 작을때..
               return NO_MORE;           
           }
           else {   // 9이면.
                for ( i = more_long - 1 ; i >= 0 ; i-- ){
                    result = CHARINT(l[i]) + 1;
                    if ( result >= 10 && i == 0 ){
                       return MORE;
                    }
                    if ( result < 10 ) {
                       return NO_MORE;
                    }
                }
           }
       }
       more_long--;
       more_short--;
    }
  }
  else if ( l_len == r_len ) {
     same_len = l_len + 1;
     while(same_len--){
        result   = CHARINT(l[same_len]) + CHARINT(r[same_len]) + over;
        over     = (result >= 10 ? 1 : 0);
        result   = ( over == 1 ? result -= 10 : result );
        if ( same_len == 0 && over == 1 ) return MORE;       
        else if ( same_len == 0 && over == 0 ) return NO_MORE;
        if ( CHARINT(l[same_len - 1]) + CHARINT(r[same_len-1]) < 9 ) over = 0;
     }     
  }
    return ERROR;
}