디시인사이드 갤러리

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

갤러리 본문 영역

이것도 팩토리알

iljeomobolt갤로그로 이동합니다. 2012.03.07 17:29:44
조회 56 추천 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 대학생 필수템! What's in my Bag 운영자 25/11/21 - -
공지 프로그래밍 갤러리 이용 안내 [97] 운영자 20.09.28 48749 65
2904422 요즘은 관리잘하면 50초중까지는 꼴리는듯 ㅇㅇ(118.235) 06:25 3 0
2904421 인지과학조져라 손발이시립디다갤로그로 이동합니다. 06:13 9 0
2904420 발명도둑잡기 차단이 왜 풀려있냐? ㅇㅇ(114.30) 06:11 11 0
2904418 중국인 댓글부대 한국여론조작 포착 ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 06:07 10 0
2904415 kqueue와 epoll의 시스템 아키텍처 및 설계 철학 비교 나르시갤로그로 이동합니다. 05:46 13 0
2904410 33살 중소3년차 똥통인생 이스펙으로 중견입사 가능하냐..? ㅇㅇ(118.235) 04:59 14 0
2904408 지잡대 졸업 30살인데 학벌 세탁원하는데 학사편입vs대학원 ㅇㅇ(203.232) 04:30 14 0
2904407 Claude cli 오늘 첨 써봤는데 개발자 왜 필요하냐 프갤러(101.235) 04:26 18 0
2904389 Clair.IO.Poller: 이번에 설계했다가 gg친 API ㅋㅋ 나르시갤로그로 이동합니다. 02:59 31 0
2904375 진짜 프로그래머들 ㅈㄴ부럽다 [2] ㅅ스맨갤로그로 이동합니다. 02:18 69 0
2904367 코딩 걍 첨부터 막히는데 어캄 [2] ㅅ스맨갤로그로 이동합니다. 01:54 49 0
2904364 자바 언어 좋지.. 추억과 낭만이 깃들인 언어 ㅋㅋ [1] 나르시갤로그로 이동합니다. 01:45 41 0
2904363 거래소 api들 잘 다루고 싶으면 뭐 부터 배우면 될까요 선배님들 [3] 프갤러(114.204) 01:43 35 0
2904362 7번국도 드라이빙 때 좋을만한 브금 chironpractor갤로그로 이동합니다. 01:31 20 0
2904359 0x [1] 루도그담당(58.233) 01:22 27 0
2904358 접시 ㅇㅅㅇ [6] 헤르 미온느갤로그로 이동합니다. 01:12 48 0
2904357 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 01:09 20 0
2904356 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 01:08 30 0
2904324 오픈소스 프로젝트를 하나 해볼까 [12] 에이도비갤로그로 이동합니다. 00:02 89 0
2904320 고 언어 음 좋지 나쁘지 않고 효율적이고 음 근데 [6] 프갤러(110.8) 11.23 56 0
2904316 www.basic4mcu.com 11월까지 서비스 종료 발명도둑잡기(118.216) 11.23 18 0
2904313 카리나가 맛집이넹 ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.23 56 0
2904309 그러고 보니 프갤에서 고랭 팬은 못본거 같은데 [4] chironpractor갤로그로 이동합니다. 11.23 48 0
2904303 클라우드 엔지니어 희망하는데 [2] 프갤러(118.235) 11.23 33 0
2904298 cursor 대체할만한거 있어? [2] ㅇㅇ(124.48) 11.23 45 0
2904295 개발만한 취미가 없는 것 같음 프갤러(61.73) 11.23 57 0
2904294 살면서 잘 한 일... 후배한테 노트북 키스킨 딱 맞는 카라스스킨 5천원 넥도리아(220.74) 11.23 14 0
2904291 에구궁.. 나님 일욜밤까지 모임하구와서 배불러양 [2] ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.23 51 0
2904289 웹디자인은 이미 AI때문에 망한듯 [1] 프갤러(220.70) 11.23 46 0
2904285 왜 극좌들은 하나같이 왕따 당하는걸까? [4] ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.23 44 0
2904266 인공지능 댓글 검사기 발명도둑잡기(118.216) 11.23 27 0
2904265 배달기사 레전드네 진짜; [7] 루도그담당(58.233) 11.23 73 0
2904264 [긴급속보] 한국 연구진이 노벨상 근거를 뒤집자 현재 난리난 천문학계 발명도둑잡기(118.216) 11.23 28 0
2904262 왕따재명 안쓰럽네 ㅠ ㅅ ㅠ [2] ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.23 45 1
2904261 소프트웨어 이름으로 이렁 거 어때? [4] 나르시갤로그로 이동합니다. 11.23 54 0
2904259 긴sql도 셸스크립트도 보기 싫은데 [10] 슈퍼막코더(116.64) 11.23 65 0
2904256 이거 이직 중인데 두개중 어디가야하노 [2] 프갤러(58.231) 11.23 40 0
2904255 베린이평가좀 [1] ㅇㅇ(39.7) 11.23 43 0
2904247 간철수도 어셈블리어한다는데 [2] 타이밍뒷.통수한방(1.213) 11.23 61 0
2904245 국비조언좀요 [2] 프갤러(220.86) 11.23 57 0
2904244 어셈 짜는 중인데 헷갈린다 이기 [12] 루도그담당(58.233) 11.23 89 0
2904243 폴리글랏 툴체인이 나오면 프갤에 평화가 오려나? [10] chironpractor갤로그로 이동합니다. 11.23 65 0
2904242 베이스 ㅍㅌㅊ? ㅇㅇ(203.232) 11.23 42 0
2904240 나 불렀서? ㅇㅅㅇ [6] 프갤러(49.165) 11.23 63 0
2904237 탑 클라스 명문대 진학 퍼펙트 합격 가이드!T 프갤러(121.142) 11.23 42 1
2904232 ❤✨☀⭐⚡☘⛩☃나님 시작합니당☃⛩☘⚡⭐☀✨❤ [3] ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.23 62 0
2904231 이제 러스트 빠돌이 프갤에 안 오겠군 ㅋㅋ [1] 나르시갤로그로 이동합니다. 11.23 46 0
2904230 언어 선택권도 수저순일텐데 [2] chironpractor갤로그로 이동합니다. 11.23 61 0
2904229 파이선 얼마나 개떡 같은데 ㅎㅎ [10] 나르시갤로그로 이동합니다. 11.23 67 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2