- 함수 선언 및 호출
// 함수 선언
int function_1(int a, int b) {
// [반환형] [함수명] (매개변수)
// body
int result;
...
return result; // return하는 변수의 자료형이 선언한 반환형과 같아야함
}
// 함수 호출
int main() {
int num_1, num_2;
function(num_1,num_2); // 인수의 자료형이 선언한 매개변수의 자료형과 같아야함
return 0;
}
- 재귀함수
1. 재귀 호출 조건 필요
return문 내에 자기 자신의 함수를 다시 호출하는 부분이 포함됨
2. 종료 조건 필요
특정 조건일 때 반환형을 return하여 무한반복되지 않고 종료되어야함
- 예제
- 정수 자릿수 계산
#include <stdio.h>
long count_digits(long input) {
long result = 0;
while (input > 0) {
input /= 10; // 일의 자릿수 버리기
result++;
}
return result;
}
int main() {
long input_numbers = 0;
printf("Enter an integer: ");
scanf("%ld", &input_numbers);
printf("Number of digits in %ld is %ld", input_numbers, count_digits(input_numbers));
return 0;
}
- 중간값 계산
#include <stdio.h>
double median(double a, double b, double c) {
// 오름차순 정렬
double tmp = 0.0;
if (a > b) { // 1)
tmp = b;
b = a;
a = tmp;
}
if (b > c) { // 2)
tmp = c;
c = b;
b = tmp;
}
if (a > b) { // 3) (2)에서 순서가 바뀐 경우 고려
tmp = b;
b = a;
a = tmp;
}
return b;
}
int main() {
double num_1, num_2, num_3 = 0;
printf("Enter three numbers: ");
scanf("%lf %lf %lf", &num_1, &num_2, &num_3);
printf("Median: %.2lf", median(num_1, num_2, num_3));
return 0;
}
- GCD (최대공약수) 계산
#include <stdio.h>
int GCD(int a, int b) { // 유클리드 알고리즘 GCD(a, b) == GCD(b, r) (r = a % b, r == 0 => GCD)
if (b == 0) {
return a;
}
return (GCD(b, a % b));
}
int main() {
int num_1, num_2 = 0;
printf("Enter two integers: ");
scanf("%d %d", &num_1, &num_2);
printf("GCD of %d and %d is %d", num_1, num_2, GCD(num_1, num_2));
return 0;
}
- LCM (최소공배수) 계산
#include <stdio.h>
int GCD(int a, int b) { // 유클리드 알고리즘 GCD(a, b) == GCD(b, r) (r = a % b, r == 0 => GCD)
if (b == 0) {
return a;
}
return (GCD(b, a % b));
}
int LCM(int a, int b) { // GCD: 교집합, LCM: 합집합
return a * b / GCD(a, b);
}
int main() {
int num_1, num_2 = 0;
printf("Enter two integers: ");
scanf("%d %d", &num_1, &num_2);
printf("LCM of %d and %d is %d", num_1, num_2, LCM(num_1, num_2));
return 0;
}
- 제곱근 계산
#include <stdio.h>
double sqrt(double a, double x, int n) { // 바빌로니아 법
if (a == 0) { // 0 예외 처리 (0으로 나누기 방지)
return 0.0;
}
if (a < 0) { // 실수 범위에서 음수의 제곱근 정의되지 않음
return -1.0;
}
if (x == 0.0 && n > 0) { // a가 0에 매우 가까운 경우, x = 0 무한 재귀 방지
return 0.0;
}
if (n == 0) { // 초기항(x_0) 설정
double x = a / 2.0; // 임의의 양의 실수 x_0
return sqrt(a, x, ++n); // 전위 증가 (후위 증가시 무한 재귀)
}
double next_x = 0.5 * (x + (a / x)); // x_n+1 = 1/2 * (x_n + a/x_n)
double error = next_x - x; // lim(n->inf) x_n = sqrt(a)
if (-0.01 < error && error < 0.01) { // (abs(e) < 0.01)
return next_x;
}
return sqrt(a, next_x, ++n); // 전위 증가
}
int int_sqrt(double a, double x, int n) {
return (int)(sqrt(a, x, n) + 0.5); // 반올림, (int)는 기본적으로 소수점 아래 버림
}
int main() {
double num;
printf("Enter number: ");
scanf("%lf", &num);
printf("\n");
printf("sqrt(%.2lf) == %.2lf\n", num, sqrt(num, 0.0, 0));
printf("int_sqrt(%.2lf) == %d", num, int_sqrt(num, 0.0, 0));
return 0;
}
- 소수 판별
#include <stdio.h>
int check_prime(int n) {
if (n <= 1) { // 1은 소수가 아닌 단위수
return 0;
}
// 1 또는 자기 자신이 아닌 약수가 존재하면 소수가 아닌 합성수
for (int k = 2; k*k <= n; k++) { // k의 범위는 sqrt(n) 이하면 충분
if (n % k == 0) {
return 0;
}
}
return 1;
}
int main() {
int num = 0;
printf("Enter integer: ");
scanf("%d", &num);
printf("%d is ", num);
if (check_prime(num)) {
printf("prime number.");
} else {
printf("not prime number.");
}
return 0;
}
- 소인수분해
#include <stdio.h>
int prime_factorization(int n) {
int pow;
pow = 0;
while (n % 2 == 0) { // 1) 2로 나누어 떨어지는 만큼 나누기
n /= 2;
pow++;
}
if (pow > 0) {
printf("(2**%d)", pow);
}
for (int k = 3; k*k <= n; k += 2) { // 2) 3부터 홀수로 나누기 (모든 짝수는 2의 배수이므로 (1)에서 제거됨)
pow = 0;
while (n % k == 0) {
n /= k;
pow++;
}
if (pow > 0) {
printf("(%d**%d)", k, pow);
}
}
if (n >= 2) { // 3) 자기 자신이 소수인 경우 ((2)는 자기 자신의 제곱근까지만 확인)
printf("(%d**1)", n);
}
return 0;
}
int main() {
int num = 0;
printf("Enter integer: ");
scanf("%d", &num);
if (num <= 1) {
printf("Can not prime factorization.");
return 0;
}
printf("%d = ", num);
prime_factorization(num);
return 0;
}
- 팩토리얼 계산
#include <stdio.h>
int factorial(int n) {
if (n == 0 || == 1) { // 0! == 1
return 1;
}
return n * factorial(n-1);
}
int main() {
int num;
printf("Enter a non-negative integer: ");
scanf("%d", &num);
printf("Factorial of %d is %d", num, factorial(num));
return 0;
}
- 피보나치 수열
#include <stdio.h>
// 반복문을 이용하면 복잡도 O(n)
// 재귀함수를 이용하면 복잡도 O(2^n)
int F(int n) {
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
if (n >= 2) {
return F(n-1) + F(n-2);
}
}
int main() {
int num;
printf("Enter a non-negative integer: ");
scanf("%d", &num);
printf("F(%d) = %d", num, F(num));
return 0;
}
- 다항식 계산 (거듭제곱 함수)
#include <stdio.h>
long pow(long x, int n) {
long result = 1;
for (int i = 0; i < n; i++) {
result *= x;
}
return result;
}
int main() {
long x;
printf("Enter an integer: ");
scanf("%ld", &x);
printf("\n");
printf("x = %ld\n", x);
printf("3x^5 + 2x^4 - 5x^3 - x^2 + 7x - 6 = %ld", 3*pow(x, 5) + 2*pow(x, 4) - 5*pow(x, 3) - pow(x, 2) + 7*x - 6);
return 0;
}