[C언어] 수학 펙토리얼(factorial) 구하기
[C언어] 수학 펙토리얼(factorial) 구하기
- 온라인 웹컴파일러 : https://ideone.com
예전에 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개를 소개 했잖아요. 이처럼 어떤 코딩을 할 때 하나의 코딩으로 만들지 말고 둘 이상의 코딩화 작업을 꼭 해주세요. 그래야 응용력을 키울 수 있어 나중에는 하나의 코딩을 보고 다양한 시각을 갖고 다양한 표현을 할 수 있게 됩니다.
짱짱맨 호출에 응답하였습니다.
3.1 운동 100주년을 기념하여 북이오는 "독도 - 인터넷독본"을 한시적으로 무료판매 합니다.
널리 공유되기를 희망하며, 참여에 감사를 드립니다.
방문해주셔서 감사해요.
보클왔어요~
감사해요
두 개 이상의 알고리즘으로 문제를 풀어보면 확실히 나중에 큰 도움이 되겠네요.
Posted using Partiko Android
학창 시절에는 과제 같은 것 내주면 하나의 주제에 대해 5가지 이상 코딩해서 풀기도 했지요.
나중에 이게 쌓이니 상상력이 많이 개발되더군요.어떤 기법이나 알고리즘을 배우면 이걸 전혀 다른 분야에 적용해 보는 상상력을 많이 하게 되네요.
아우. 머리야^^ 라이브러리 함수 있겠죠?
Posted using Partiko Android
일반적인 수학함수들은 라이브러리를 제공하지만 공식같은 수식은 직접 만들어 해요. ^^