Skip to content
리눅스/BSD

생코보다_만든c언어libgmp사용_팩토리얼.c

by 흑엽 posted Jul 31, 2015

리눅스 C언어에서 [엄청~큰 숫자형]을 지원하는 라이브러리를 루트권한에서 설치!
apt-get install libgmp-dev
==============


팩토리얼이란?
https://ko.wikipedia.org/wiki/%EA%B3%84%EC%8A%B9
===========


$ cat 생코보다_만든c언어libgmp사용_팩토리얼.c
#include <stdio.h>
#include <gmp.h>
#include <time.h>
// https://kldp.org/node/129116 여기서 글올리신 분의 코드중에 설명이 필요한 부분에 주석달고, 코드중에는 출력과 입력부분을 수정했습니다.
void factorial(mpz_t* f, unsigned int n)
{
    unsigned int i = 1;

    for (i = 1; i <= n ; i++){ // 파라미터에서 정한 개수 만큼 반복해서 팩토리얼 하는 중. 
        mpz_mul_si(*f, *f, i); // http://gmplib.org/manual/Integer-Arithmetic.html#index-mpz_005fmul_005fsi-285
    }
}

int main(int argc, char **argv)
{
    mpz_t facN; //엄청~큰 변수
    unsigned int n = atol(argv[1]);// 파라미터 1번의 값으로 총 팩토리얼 개수를 정함 
    clock_t start, end;
    double runtime;


    mpz_init(facN); // https://gmplib.org/manual/Initializing-Integers.html#index-mpz_005finit-244
    mpz_set_ui(facN, 1L); //엄청~큰 변수 객체 초기화 등등 https://gmplib.org/manual/Assigning-Integers.html#index-mpz_005fset_005fui-253

   

    start = clock(); //계산시작 타이머
    factorial(&facN, n);//반복해서 팩토리얼 하는 함수 호출
    end = clock(); //계산끝 타이머 종료

   

    runtime = (double)(end-start) / CLOCKS_PER_SEC;
    printf ("실행시간  %f초\n", runtime);
    printf ("이하 파라미터로 지정된 %u의 팩토리얼 계산결과", n);
    mpz_out_str(stdout, 10, facN); //계산완료된 변수를 출력하는 이부분에서... 위의 runtime보다 시간이 더 소모될수 있음. 
    printf("\n");

    mpz_clear(facN);
}
=========


컴파일 명령어
gcc -o생코보다_만든c언어libgmp사용_팩토리얼 생코보다_만든c언어libgmp사용_팩토리얼.c -lgmp
============


실행명렁어
 ./생코보다_만든c언어libgmp사용_팩토리얼 1000000 > 생코보다_만든c언어libgmp사용_팩토리얼result.txt &
============


실행결과->생코보다_만든c언어libgmp사용_팩토리얼result.txt의 내용
실행시간  308.84초(실험용으로 쓰는 vmware에서 돌렸기 때문에, 빠른 컴퓨터에서는 더 좋은 결과가 나올듯)
이하 파라미터로 지정된 1000000의 팩토리얼 계산결과 --> txt파일 용량만 5.8매가이고, 556만자리라 로딩이 안될까봐  유툽 동영상으로 올림. http://youtu.be/1J_nmOL3Mmo


Copyright ⓒ 성우 All rights reserved

Powered by SungWoo / Designed by SungWoo

sketchbook5, 스케치북5

sketchbook5, 스케치북5