디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

이것도 팩토리알

iljeomobolt갤로그로 이동합니다. 2012.03.07 17:29:44
조회 57 추천 0 댓글 0


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

/*  이 값이 최대 연산 가능한 자리수이다.
이 값을 늘리면 더 많은 자리수도 연산가능해진다.
하지만 system memory가 허락하는 범위 안에서 가능하다. */
#define MAX_BUFF_SIZE   5000000

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;
  char *b;
  char c;
  char *result;
  int i;

  a = (char *)malloc(MAX_BUFF_SIZE);
  b = (char *)malloc(MAX_BUFF_SIZE);
  result = (char *)malloc(MAX_BUFF_SIZE);



 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;

  temp = (char *)malloc(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';

  free(temp);
}


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

  aa = (char *)malloc(MAX_BUFF_SIZE);
  bb = (char *)malloc(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");
  }

  free(aa);
  free(bb);
}


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

  int isMinus=0;
  char *temp, *aa, *bb;
  char *p, *q;


  temp = (char *)malloc(MAX_BUFF_SIZE);
  aa = (char *)malloc(MAX_BUFF_SIZE);
  bb = (char *)malloc(MAX_BUFF_SIZE);

  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;
    }
  }

  free(temp);
  free(aa);
  free(bb);

}



int nanugiLoop = 0;

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

  aa = (char *)malloc(MAX_BUFF_SIZE);
  bb = (char *)malloc(MAX_BUFF_SIZE);
  cc = (char *)malloc(MAX_BUFF_SIZE);
  temp = (char *)malloc(MAX_BUFF_SIZE);
  temp1 = (char *)malloc(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] != '-'){
    char *aaa;
    char *bbb;
    char *ccc;

    aaa = (char *)malloc(MAX_BUFF_SIZE);
    bbb = (char *)malloc(MAX_BUFF_SIZE);
    ccc = (char *)malloc(MAX_BUFF_SIZE);

    if(nanugiLoop++ < 30){
      strcpy(aaa, temp[0] == '-' ? aa : temp);
      strcpy(bbb, "10");
      gobhagi(aaa, bbb, ccc);
      //      printf("%2d : %s * %s = %s\n",nanugiLoop ,aaa,bbb,ccc);
      nanugi(ccc, b, bbb);
      //      printf("%2d : %s / %s = %s\n",nanugiLoop ,ccc,b,bbb);
    } /* if(nanugiLoop < 30){ */

    if(strcmp(bbb,"0") == 0) strcpy(bbb,"");

    if(nanugiLoop-- > 1){
      strcat(result, bbb);
    }else{
      strcat(result, ".");
      strcat(result, bbb);
    } /* if(nanugiLoop-- > 0){ */
    //    strcat(result, " 나머지 ");
    //    strcat(result, temp[0] == '-' ? aa : temp);
    free(aaa);
    free(bbb);
    free(ccc);
  }

  free(temp);
  free(temp1);
  free(aa);
  free(bb);
  free(cc);
}

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

  aa = (char *)malloc(MAX_BUFF_SIZE);
  bb = (char *)malloc(MAX_BUFF_SIZE);
  rst = (char *)malloc(MAX_BUFF_SIZE);

  strcpy(aa, a);
  strcpy(rst, a);
  do{
    bbegi(aa, "1", bb);
    strcpy(aa,bb);
    printf("now -> %s\n", bb);
    gobhagi(rst, bb, result);
    strcpy(rst, result);
  }while(strcmp(bb, "2"));


  free(aa);
  free(bb);
  free(rst);
}



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

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

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

추천 비추천

0

고정닉 0

0

원본 첨부파일 1

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 뛰어난 운동 신경으로 남자와 싸워도 이길 것 같은 여자 스타는? 운영자 25/11/24 - -
이슈 [디시人터뷰] 충무로가 주목하는 신예, '세계의 주인' 서수빈 운영자 25/11/24 - -
AD 대학생 필수템! What's in my Bag 운영자 25/11/21 - -
306547 오늘 집중안되서 디씨만 했네 [2] 알렉산더갤로그로 이동합니다. 12.03.09 60 0
306545 님들 폰트 뭐 씀? [7] 아놔콘다갤로그로 이동합니다. 12.03.09 166 0
306544 알고리즘이랑 OS랑 디는 교수갈키는거 말고라도 더 제대로 공부해야되지 ? [2] ㅇㅇ(211.117) 12.03.09 90 0
306543 게임 데이터는 어떻게 저장하는지 궁금함 [13] 야요이갤로그로 이동합니다. 12.03.09 161 0
306542 프로그래밍에 초보자가 보면 도움이 되는 책 추천좀 [4] ㅇ힝허잏ㅇ(1.230) 12.03.09 67 0
306541 제 코딩 스타일이 이상한건지 [13] 회전매니아갤로그로 이동합니다. 12.03.09 231 0
306540 락킹 I/O 인가 ?? 뭐지 못알아듣겟당 [4] ㅁㅇㄴㄹ(211.117) 12.03.09 59 0
306539 아 밑에 IF ELSE 글 보고 존내 찔리네 ㅅㅂ [2] 야요이갤로그로 이동합니다. 12.03.09 58 0
306538 날짜를 연월일로 나눠서 저장해두면 피곤해지는 사례 [5] 나라퐁(211.104) 12.03.09 93 0
306537 CONNECT BY 쓰면 속도 느려짐 ?? 야요이갤로그로 이동합니다. 12.03.09 36 0
306536 수습 3개월 이라는 타이틀은 좋은건지 나쁜건지는 모르겠다 [8] SFCFS갤로그로 이동합니다. 12.03.09 120 0
306535 게임 프로그래밍 실무 관련 질문 [7] 야요이갤로그로 이동합니다. 12.03.09 86 0
306533 군대에서는 말 안듣고 병신같이 행동하는 후임 어떻게 조지냐 [2] 나라퐁(211.104) 12.03.09 91 0
306532 디비의 문제는 저거뿐만이 아니야.. [6] SFCFS갤로그로 이동합니다. 12.03.09 102 0
306531 난 말이야 내 후임이 제발 좀 일찍 출근했으면 좋겠다 [5] 나라퐁(211.104) 12.03.09 91 0
306530 os 넘어렵다 ㅁㅇㄴㄹ(211.117) 12.03.09 34 0
306529 아이폰 개발하는 횽 있으메? [4] 공돌이대장갤로그로 이동합니다. 12.03.09 74 0
306528 디비 질문한거 자세히 풀으면 [18] SFCFS갤로그로 이동합니다. 12.03.09 134 0
306526 데이터베이스하는 사람있어??? [8] SFCFS갤로그로 이동합니다. 12.03.09 130 0
306523 PHP 배우려는데 사전지식이나 연계해서 하면 좋을만 한거 있어? 형들? [1] Lowforce갤로그로 이동합니다. 12.03.09 54 0
306521 아아 갑자기 땡긴다 조공 짤을 풀겠다 뒤는 알아서 조심 서현빠돌이갤로그로 이동합니다. 12.03.09 108 0
306519 인터넷창을 여러개 띄워놓았을 때 빨리 전환하는 법 아는 횽 있어?ㅜ [3] 흰색까마귀(118.33) 12.03.09 64 0
306518 이야 너무 야햇! ㅇㅇㅎ(117.111) 12.03.09 57 0
306517 방통위에 천리안 신고했음. iljeomobolt갤로그로 이동합니다. 12.03.09 75 0
306516 프갤횽들은 군대 어떻게갓음? [9] ㅇㅇ(121.66) 12.03.09 69 0
306514 시스템프로그래밍책추천점 중간점검갤로그로 이동합니다. 12.03.09 82 0
306512 조공을 올리옵니다. [1] 맙이갤로그로 이동합니다. 12.03.09 109 0
306511 GPIO에 대해서 질문좀 할께요 [1] (218.209) 12.03.09 59 0
306510 facebook 너무 짜증나 ㅠ.ㅠ [4] iljeomobolt갤로그로 이동합니다. 12.03.09 90 0
306509 if - else 가 점점 늘어나는 이유 [1] 아놔콘다갤로그로 이동합니다. 12.03.09 129 0
306508 2의 보수 덧셈 질문좀 해도되? [13] 맙이갤로그로 이동합니다. 12.03.09 186 0
306504 내가 2개월만에 그만둔 회사... [6] 아놔콘다갤로그로 이동합니다. 12.03.09 261 0
306503 cuda많이 씀? [6] 그딴건없구염'ㅡ'갤로그로 이동합니다. 12.03.09 106 0
306502 Hotmail 계정 사용중지 누르면 분당살람갤로그로 이동합니다. 12.03.09 43 0
306501 우리회사는.. 적이되고싶은가갤로그로 이동합니다. 12.03.09 35 0
306499 방통위에 한국ms를 신고했음 [1] 분당살람갤로그로 이동합니다. 12.03.09 78 0
306498 정전인 프갤을 덕짤로 정화! System32갤로그로 이동합니다. 12.03.09 71 0
306496 컴공 들어온 애들 중에 1학년 때 실망하는 애들 많지 않냐?? [1] 서현빠돌이갤로그로 이동합니다. 12.03.09 138 0
306495 프갤횽들.. 쿼리 짤때.. [7] 적이되고싶은가갤로그로 이동합니다. 12.03.09 114 0
306492 퇴근의 정석 [1] 서현빠돌이갤로그로 이동합니다. 12.03.09 55 0
306491 퇴근 테크 트리 [4] ㅇㅇ(14.48) 12.03.09 83 0
306490 오늘부터 개발자들은 칼퇴근을 명령한다!!!!!!!!!!! 서현빠돌이갤로그로 이동합니다. 12.03.09 50 0
306489 윗놈들 눈치 보며 퇴근을 힘겨워 하지 마라 [3] 서현빠돌이갤로그로 이동합니다. 12.03.09 107 0
306488 퇴근하겠습니다? 퇴근해보겠습니다? 그딴게 어딨냐? [4] iljeomobolt갤로그로 이동합니다. 12.03.09 92 0
306487 시스템프로그래밍책뭐가좋나요? 중간점검갤로그로 이동합니다. 12.03.09 38 0
306486 왜 우리나라는 퇴근할 때 눈치를 보는가?? [3] 서현빠돌이갤로그로 이동합니다. 12.03.09 93 0
306485 형님들, JAVA에서 키보드없이 키보드 눌린효과를 주고 싶은데요... [6] 로히블랑코(211.221) 12.03.09 97 0
306484 JSP에 소스 다 때려박으면 말야 [3] 야요이갤로그로 이동합니다. 12.03.09 69 0
306483 강간을 해보겠습니다. [1] 야요이갤로그로 이동합니다. 12.03.09 81 0
306482 '퇴근해보겠습니다' 는 정확한 표현이다. [2] 바보플머(218.155) 12.03.09 542 1
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2