08. 함수

2025. 10. 17. 17:05·Coding/C
  • 함수 선언 및 호출
// 함수 선언
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;
}

'Coding > C' 카테고리의 다른 글

10. 포인터  (0) 2025.11.21
09. 변수의 범위와 지속기간  (0) 2025.11.21
07. 배열  (0) 2025.10.16
06. 반복문  (0) 2025.09.30
05. 조건문  (0) 2025.09.30
'Coding/C' 카테고리의 다른 글
  • 10. 포인터
  • 09. 변수의 범위와 지속기간
  • 07. 배열
  • 06. 반복문
rlarudfhr
rlarudfhr
  • rlarudfhr
    androcom
    rlarudfhr
  • 전체
    오늘
    어제
    • 분류 전체보기 (96)
      • Coding (28)
        • Python (10)
        • C (13)
        • Github & Git (2)
        • WEB FE (3)
      • Mathematics (3)
        • 미적분학 (19)
        • 통계학 (16)
        • 선형대수 (10)
      • Quantum Computing (0)
      • PC & Mobile & Audio (7)
      • Etc (13)
  • 링크

    • Github
    • Baekjoon
    • Instagram
  • 공지사항

  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
rlarudfhr
08. 함수
상단으로

티스토리툴바