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


#define MAX_BUFF_SIZE    930000

void deohagi(char *, char *, char *);
void bbegi(char *, char *, char *);
void gobhagi(char *, char *, char *);
void nanugi(char *, char *, char *);
void fac(char *, char *);

void outfile(char *, char *, char *, char);

main()
{
  char a[MAX_BUFF_SIZE];
  char b[MAX_BUFF_SIZE];
  char c;
  char result[MAX_BUFF_SIZE];
  int i;


 cont:
 
  for(i=0;i<MAX_BUFF_SIZE;i++){
    a[i] = b[i] = result[i] = \'\\0\';
  }

  printf(\"input number a->\");
  gets(a);

  if(strlen(a) > MAX_BUFF_SIZE){
    printf(\"input error 첨부터 다시..\\n\");
    goto cont;
  }

  printf(\"연산방식 입력( + - * / ! )-> \");
  gets(result);
  c = result[0];
  strcpy(result, \"0\");
  if(c != \'+\' && c != \'-\' && c != \'*\' && c != \'/\' && c != \'!\'){
    printf(\"input error 첨부터 다시..\\n\");
    goto cont;
  }

  if(c != \'!\'){
    printf(\"input number b->\");
    gets(b);

    if(strlen(b) > MAX_BUFF_SIZE){
      printf(\"input error 첨부터 다시..\\n\");
      goto cont;
    }
  }

  //  printf(\"값을 입력해라.. ex)1000 + 1000) 연산은 + - * / !\\n\");
  //  scanf(\"%s %c %s\", a, &c, b);
  //  getchar(); // 마지막 엔터 읽어서 없에기..

  if(c != \'+\' && c != \'-\' && c != \'*\' && c != \'/\' && c != \'!\'){
    printf(\"input error 연산자, 첨부터 다시..\\n\");
    goto cont;
  }
  if(strlen(a) > MAX_BUFF_SIZE){
    printf(\"input error A수 , 첨부터 다시..\\n\");
    goto cont;
  }
  if(strlen(b) > MAX_BUFF_SIZE){
    printf(\"input error 뒷수,  첨부터 다시..\\n\");
    goto cont;
  }

  if(c == \'+\'){
    deohagi(a, b, result);
    printf(\"\'%s\'\\n\",result);
    //    outfile(a, b, result, c);
  }else if(c == \'-\'){
    bbegi(a, b, result);
    printf(\"\'%s\'\\n\",result);
    //    outfile(a, b, result, c);
  }else if(c == \'*\'){
    gobhagi(a, b, result);
    printf(\"\'%s\'\\n\",result);
    //    outfile(a, b, result, c);
  }else if(c == \'/\'){
    nanugi(a, b, result);
    printf(\"\'%s\'\\n\",result);
    //    outfile(a, b, result, c);
  }else if(c == \'!\'){
    fac(a, result);
    printf(\"\'%s\'\\n\",result);
    outfile(a, \"\", result, c);
  }

 KIN:
  printf(\" \\n\");
exit(0);
  gets(result);
  c = result[0];
  if(c == \'2\'){
    exit(0);
  }else if(c == \'1\'){
    goto cont;
  }else{
    printf(\"똑바로 입력해라\\n\");
    goto KIN;
  }

}

// 0: 48, 9:57
void deohagi(char *a, char *b, char *result)
{
  int i;
  int lenA, lenB, lenC;
  int smallRst, smallPa;
  char temp[MAX_BUFF_SIZE];
 
  smallRst = smallPa = 0;

  lenA = strlen(a)-1;
  lenB = strlen(b)-1;
  lenC = 0;

  for(i=0;i<MAX_BUFF_SIZE;i++, lenA--, lenB--){
    if(lenA > -1 && lenB > -1){
      smallRst = (a[lenA] - 48) + (b[lenB] - 48) + smallPa;
      smallPa = smallRst>=10 ? 1 : 0 ;
      smallRst = smallRst % 10;
      temp[i] = smallRst + 48;
    }else{
      if(lenA > -1){
    smallRst = (a[lenA] - 48) + smallPa;
    smallPa = smallRst>=10 ? 1 : 0 ;
    smallRst = smallRst % 10;
    temp[i] = smallRst + 48;
      }else if(lenB > -1){
    smallRst = (b[lenB] - 48) + smallPa;
    smallPa = smallRst>=10 ? 1 : 0 ;
    smallRst = smallRst % 10;
    temp[i] = smallRst + 48;
      }else{
    temp[i] = smallPa + 48;
    temp[i+1] = \'\\0\';
    break;
      }
    }//  if(lenA > -1 && lenB > -1){
  }
 
  if(smallPa)
    i++;
 
  for(lenC=0;i>=0;i--,lenC++){
    result[lenC-1] = temp[i];
  }
  result[lenC] = \'\\0\';
}


void gobhagi(char *a, char *b, char *result)
{
  int i,j;
  int lenB;
  char aa[MAX_BUFF_SIZE];
  char bb[MAX_BUFF_SIZE];

  strcpy(aa, \"0\");
  strcpy(bb, a);
  lenB = strlen(b) -1;

  for(i=0;lenB > -1;i++, lenB--){
    j = b[lenB] - 48;

    for(;j>0;j--){        /*  */
      deohagi(aa, bb, result);
      strcpy(aa, result);
    }
    strcat(bb,\"0\");
  }
}


void bbegi(char *a, char *b, char *result)
{
  int i;
  int lenA, lenB, lenC;
  int smallRst, smallPa;

  int isMinus=0;
  char temp[MAX_BUFF_SIZE];
  char aa[MAX_BUFF_SIZE], bb[MAX_BUFF_SIZE];
  char *p, *q;
 
  smallRst = smallPa = 0;

  lenA = strlen(a)-1;
  lenB = strlen(b)-1;
  lenC = 0;

  strcpy(aa, a);
  strcpy(bb, b);

  if(lenA < lenB){
    isMinus = 1;
  }else if(lenA == lenB){
    if(a[0] < b[0]){
      isMinus = 1;
    }
  }

 min:
  if(isMinus){
    strcpy(temp, aa);
    strcpy(aa, bb);
    strcpy(bb, temp);
    lenA = strlen(aa)-1;
    lenB = strlen(bb)-1;
  }

  for(i=0;i<MAX_BUFF_SIZE;i++, lenA--, lenB--){
    if(lenA > -1 && lenB > -1){
      smallRst = (aa[lenA] - 48) - (bb[lenB] - 48) - smallPa;
      smallPa = 0;
      if(smallRst < 0){
    smallRst += 10;
    smallPa = 1;
      }
      temp[i] = smallRst + 48;
    }else{
      if(lenA > -1){
    smallRst = (aa[lenA] - 48) - smallPa;
    smallPa = 0;
    if(smallRst < 0){
      smallRst += 10;
      smallPa = 1;
    }
    smallRst = smallRst % 10;
    temp[i] = smallRst + 48;
      }else if(lenB > -1){
    smallRst = (bb[lenB] - 48) - smallPa;
    smallPa = 0;
    if(smallRst < 0){
      smallRst += 10;
      smallPa = 1;
    }
    smallRst = smallRst % 10;
    temp[i] = smallRst + 48;
      }else{
    if(smallPa){
      smallPa = 0;
      isMinus = 1;
      goto min;
    }
    //    temp[i] = smallPa + 48 ;
    temp[i] = \'\\0\';
    break;
      }
    }//  if(lenA > -1 && lenB > -1){
  }
 
  lenC=0;
  if(isMinus){
    result[0] = \'-\';
    lenC += 2;
    i--;
  }

  for(;i>=0;i--){
    result[lenC-1] = temp[i];
    lenC++;
  }
  result[lenC] = \'\\0\';

  q = p = result;
  while(*p){
    if(*p == \'-\'){
      p++;
      q++;
    }else if(*p == \'0\'){
      p++;
    }else{
      strcpy(q, p);
      break;
    }
  }

}


void nanugi(char *a, char *b, char *result)
{
  char aa[MAX_BUFF_SIZE];
  char bb[MAX_BUFF_SIZE];
  char cc[MAX_BUFF_SIZE];
  char temp[MAX_BUFF_SIZE];
  char temp1[MAX_BUFF_SIZE];

  strcpy(aa, a);
  strcpy(bb, b);
  strcpy(cc, \"0\");

  while(1){
    memset(temp1, 0, MAX_BUFF_SIZE);
    memset(temp, 0, MAX_BUFF_SIZE);
    bbegi(aa, bb, temp);
    if(temp[0] != \'-\' ){
      if(temp[0] == \'0\'){
    deohagi(cc, \"1\", temp1);
    break;
      }

      strcpy(aa, temp);
      deohagi(cc, \"1\", temp1);
      strcpy(cc, temp1);
    }else{
      break;
    }
  }
 
  strcpy(result, temp[0] != \'-\' ? temp1 : cc);
  if(temp1[0] != \'0\' || temp1[0] != \'-\'){
    strcat(result, \" 나머지 \");
    strcat(result, temp[0] == \'-\' ? aa : temp);
  } 
}

void fac(char *a, char *result)
{
  char aa[MAX_BUFF_SIZE];
  char bb[MAX_BUFF_SIZE];
  char rst[MAX_BUFF_SIZE];

  strcpy(aa, a);
  strcpy(rst, a);
  do{
    bbegi(aa, \"1\", bb);
    strcpy(aa,bb);
    gobhagi(rst, bb, result);
    strcpy(rst, result);
  }while(strcmp(bb, \"2\"));

}



void outfile(char *a, char *b, char *c, char d)
{
  FILE *fp;

  fp = fopen(\"infile.dat\", \"w\");
  fprintf(fp,\"%s %c %s\", a, d, b);
  fclose(fp);

  fp = fopen(\"outfile.dat\", \"w\");
  fprintf(fp,\"%s\", c);
  fclose(fp);
}