[C언어] 수학 펙토리얼(factorial) 구하기

in #kr-dev6 years ago (edited)

[C언어] 수학 펙토리얼(factorial) 구하기



예전에 C언어를 초기 공부할 때 수학공식들을 C언어로 코딩화 하는 공부를 많이 했었는데 그 한 예를 소개를 합니다.

1. 수학 펙토리얼


위키백과에 따르면 factorial(자연수의 계승)은 그 수보다 작거나 같은 모든 양의 정수의 곱이라고 정의합니다.

[공식]

예)

5! = 5 x 4 x 3 x 2 x 1 = 120

그러면 C언어로 5!가 120 되게끔 코딩을 해 볼까요.

2. 코딩


[펙토리얼 알고리즘]

int factor1(int n)
{
   if(n==1)
      return 1;
   else
      return (n*factor1(n-1));
}

재귀호출문으로 n의 값이 n-1씩 감소하면서 계속 호출하여 자연수의 계승을 하게 됩니다.

n * factor1(n-1)
n * n-1 * factor1(n-2)
...
n * n-1 * n-2 * ...  * factor1(1)

이렇게 호출을 하여 나열하여 모든 수의 곱을 한 뒤 n! 값을 계산하게 됩니다.

그리고 위 알고리즘과 유사하게 다른 방식으로 코딩을 할 수 있습니다. 위 알고리즘은 if문을 이용해서 재귀호출문을 이용했지만 다음 방법은 while()문으로 루푸문을 이용하여 n!를 구하는 알고리즘을 만들어 보겠습니다.

int factor2(int n)
{
   int tmp=n;
  
   while(n>1) tmp*=--n; 

   return tmp;

}

while문으로 계속 n이 1보다 클때까지 -1씩 감소한 n의 값을 곱하게 됩니다.

그러면 정상적으로 결과가 나오는지 확인해 봅시다.

3. 실행


#include <stdio.h> 
int factor1(int n)
{
   if(n==1)
      return 1;
   else
      return (n*factor1(n-1));
}
 
int factor2(int n)
{
   int tmp=n;
  
   while(n>1) tmp*=--n; 

   return tmp;

}
 
void main()
{
   int max,tmp;
 
  printf("펙토리아의 최대값 입력 : ");
  scanf("%d",&max);
  printf("\n");
  tmp=factor1(max); 
  printf("factorial %d는 %d입니다.\n",max,tmp);
  tmp=factor2(max);
  printf("factorial %d는 %d입니다.\n",max,tmp);
}

[결과]

마무리


진짜 초창기 C언어 공부할 때 수학을 이렇게 C코딩하는게 너무 재밌었습니다. 공식을 알고리즘으로 만들고 간단히 입력값만 넣으면 컴퓨터가 알아서 계산해서 결과를 나타내주니 어려운 공식이나 계산식을 코딩화 하면 쉽게 계산 결과를 얻을 수 있어 힘들게 계산 할 필요 없어 재밌더군요.

예전에 전자회로를 배울 때 회로 공식을 C언어로 만들어 놓고 설계한 회로도에 전류, 전압, 저항 값을 입력하여 편하게 계산을 했던 추억이 떠오르네요.

참고로, 위에서 펙토리얼을 구하는 방식을 2개를 소개 했잖아요. 이처럼 어떤 코딩을 할 때 하나의 코딩으로 만들지 말고 둘 이상의 코딩화 작업을 꼭 해주세요. 그래야 응용력을 키울 수 있어 나중에는 하나의 코딩을 보고 다양한 시각을 갖고 다양한 표현을 할 수 있게 됩니다.


Sponsored ( Powered by dclick )

dclick-imagead

Sort:  

짱짱맨 호출에 응답하였습니다.

3.1 운동 100주년을 기념하여 북이오는 "독도 - 인터넷독본"을 한시적으로 무료판매 합니다.

관련 포스팅: 신용하 서울대 교수의 "독도 인터넷 독본" 무료판매

널리 공유되기를 희망하며, 참여에 감사를 드립니다.

방문해주셔서 감사해요.

보클왔어요~

감사해요

두 개 이상의 알고리즘으로 문제를 풀어보면 확실히 나중에 큰 도움이 되겠네요.

Posted using Partiko Android

학창 시절에는 과제 같은 것 내주면 하나의 주제에 대해 5가지 이상 코딩해서 풀기도 했지요.
나중에 이게 쌓이니 상상력이 많이 개발되더군요.어떤 기법이나 알고리즘을 배우면 이걸 전혀 다른 분야에 적용해 보는 상상력을 많이 하게 되네요.

아우. 머리야^^ 라이브러리 함수 있겠죠?

Posted using Partiko Android

일반적인 수학함수들은 라이브러리를 제공하지만 공식같은 수식은 직접 만들어 해요. ^^

Coin Marketplace

STEEM 0.20
TRX 0.16
JST 0.030
BTC 66331.68
ETH 2720.25
USDT 1.00
SBD 2.87