디시인사이드 갤러리

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

갤러리 본문 영역

이것도 팩토리알

iljeomobolt갤로그로 이동합니다. 2012.03.07 17:29:44
조회 59 추천 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 - -
AD 따뜻한 겨울나기! 방한용품 SALE 운영자 25/11/27 - -
306798 오라클 책 추천 좀 ㅜㅜ 1111(115.93) 12.03.12 33 0
306797 버그 리포트가 나왔는데.. ㅇㅇ(58.102) 12.03.12 23 0
306796 1.5v횽 어딨어!!! 당장 나오라그래!!! [5] Gromit갤로그로 이동합니다. 12.03.12 69 0
306794 곽팀장이 원하는 것 [1] 분당살람갤로그로 이동합니다. 12.03.12 80 0
306792 형들 전공서적 사서 써? [2] ㅇㅇ(121.160) 12.03.12 463 0
306784 곽팀장 저 또라이새끼는 왜 또 와서 지랄이냐 elwlwlwk갤로그로 이동합니다. 12.03.12 60 0
306775 [3] 공돌이대장갤로그로 이동합니다. 12.03.12 41 0
306774 일어나라 [3] 남대생.갤로그로 이동합니다. 12.03.12 65 0
306773 haemaddos는 뭐드래요 성님들? ㅠㅠㅠㅠㅍ(211.195) 12.03.12 44 0
306772 아이러브유 유러브미 중간점검갤로그로 이동합니다. 12.03.12 359 5
306767 야 -_- C++ 컴파일이 안되는데 이게 뭔문제임? [5] 니 코 가 뭐갤로그로 이동합니다. 12.03.12 103 0
306764 삼각수 때려맞추기.... [3] 아놔콘다갤로그로 이동합니다. 12.03.12 90 0
306763 소스 베꼈는지 검사하는 프로그램이 정말 있어? [14] 나그네(112.154) 12.03.11 233 0
306762 다시 정전 생물학(175.119) 12.03.11 28 0
306760 퇴근해보겠습니다 이거 왜이리 아직도 기억에 남지 [2] Aven갤로그로 이동합니다. 12.03.11 94 0
306759 안드로이드 사전어플 머쓰냐 [1] dd(211.117) 12.03.11 60 0
306758 2차 정전 [1] 생물학(175.119) 12.03.11 38 0
306757 보통 수학여행가면 도박하지 않음? [4] 항우(112.133) 12.03.11 122 0
306755 형들은 눈아플때 어떻게 함? ㅇㅇㅎ(110.47) 12.03.11 46 0
306754 정전정전 [9] 생물학(175.119) 12.03.11 62 0
306752 내가 쏜다 ㅅ1발 프갤을 위하여 [11] 김클립스(110.46) 12.03.11 124 0
306750 이클립스 다시 질문 모두들 클릭해 [10] 김클립스(110.46) 12.03.11 120 0
306749 대학 과젠데.. [39] 소 나무갤로그로 이동합니다. 12.03.11 240 0
306748 형들 c언어 기초 질문좀... [5] dndhkd(116.123) 12.03.11 86 0
306747 정전은 아닌데 조용해 생물학(175.119) 12.03.11 27 0
306746 이클립스 [8] 김클립스(110.46) 12.03.11 75 0
306745 까꿍 [6] dlbo갤로그로 이동합니다. 12.03.11 98 0
306744 미테 장기판 마 움직임 최소비용/루트 구하기 성대아싸식 풀이법 2 [4] [성대아싸]갤로그로 이동합니다. 12.03.11 124 0
306743 미테 장기판 마 움직임 최소비용/루트 구하기 성대아싸식 풀이법 1 [10] [성대아싸]갤로그로 이동합니다. 12.03.11 222 0
306742 IT 계열학과 나오시고 공기업 다니시는분 계세요? [2] 소소한(14.41) 12.03.11 258 0
306741 으혀랴디 소환 (장기판 코드) 생물학(175.119) 12.03.11 48 0
306740 ㅇㅇㅎ횽을 위한 애니찡 [1] 모미지갤로그로 이동합니다. 12.03.11 39 0
306738 자기가 혼자서 기계 만들어서 거기 OS넣고 프로그램 만들 수 있음? (124.49) 12.03.11 42 0
306735 JAVA 에러나는 이유 좀.. [4] (58.75) 12.03.11 64 0
306734 16진수로 된거 쉬프트 연산할려면 [5] dd(211.117) 12.03.11 86 0
306733 이거 아는횽 잇남 [7] 퐈이어애그갤로그로 이동합니다. 12.03.11 72 0
306732 정전이당!!!! 김호도갤로그로 이동합니다. 12.03.11 25 0
306730 OS 책보다가 드는 의문 [5] ㅎㅎㅎㅎㅎㅎ(211.117) 12.03.11 151 0
306729 빡스2D 써본형아없어? 김호도갤로그로 이동합니다. 12.03.11 34 0
306728 씨발 알바개같네 [5] CHALLENGER갤로그로 이동합니다. 12.03.11 98 0
306727 아무리 생각하고 찾아봐도 몰라서 여기에 질문합니다 - thread+통신 [3] ㅔㅔ(125.128) 12.03.11 88 0
306726 장기 알고리즘은 어떻게 구현하냐 [84] 으혀랴디(124.197) 12.03.11 363 0
306725 신기한 경험을 했다. [2] 116.44(203.229) 12.03.11 71 0
306724 과제 바로 다햇다 헤헤헤헤헤 [13] ㅈㅈㅈㅈ(118.47) 12.03.11 145 0
306723 ㅅㅂ 조까 내가 해결한다 ㅈㅈㅈㅈ(118.47) 12.03.11 35 0
306720 너님들은 컴터 포맷 얼마마다 함? [2] 아놔콘다갤로그로 이동합니다. 12.03.11 76 0
306719 군복무중에 보람찬일을 하고 싶어 프밍 공부중인데 고민 [1] 꼬비갤로그로 이동합니다. 12.03.11 49 0
306718 나 뭐 좀 물어볼께.... [1] 아놔콘다갤로그로 이동합니다. 12.03.11 62 0
306717 수학여행 용돈을 가장효율적으로 쓰는방법 항우(112.133) 12.03.11 64 0
306716 아..공부는 해야겠는데.... 왜이렇게..귀차니즘이 심할까.. 가람§도깨비갤로그로 이동합니다. 12.03.11 35 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2