C 언어 핵심 기능 및 활용

수학 함수 사용법

C 언어에서 제공하는 주요 수학 함수는 다음과 같습니다:

  • 정수 절댓값 계산: int abs(int value) - 정수의 절댓값을 반환합니다.
  • 실수 절댓값 계산: double fabs(double value) - 실수의 절댓값을 반환합니다.
  • 거듭제곱 계산: double pow(double base, double exponent) - base의 exponent 제곱 값을 구합니다.
  • 제곱근 계산: double sqrt(double value) - value의 제곱근을 반환합니다.
  • 올림 연산: double ceil(double value) - value보다 크거나 같은 최소 정수를 반환합니다.
  • 내림 연산: double floor(double value) - value보다 작거나 같은 최대 정수를 반환합니다.

여러 입력 처리 방법

반복적인 입력을 처리하기 위해 두 가지 방법이 있습니다:

// 방법 1: 비트 연산자를 이용한 EOF 검사
#include<stdio.h>
int main() {
    int x, y;
    while (~scanf("%d%d", &x, &y)) {
        printf("%d\n", x + y);
    }
    return 0;
}
// 방법 2: 명시적 EOF 비교
#include<stdio.h>
int main() {
    int x, y;
    while (scanf("%d%d", &x, &y) != EOF) {
        printf("%d\n", x + y);
    }
    return 0;
}

팩토리얼 계산 예제

큰 수의 팩토리얼을 계산하는 프로그램입니다:

#include <stdio.h>
#define MAX_DIGITS 5660

int main() {
    int result[MAX_DIGITS] = {0};
    int length = 1;
    int carry = 0;
    int last_index = 0;
    
    result[0] = 1;
    
    for (int i = 1; i <= 1977; i++) {
        for (int j = 0; j < length; j++) {
            result[j] = result[j] * i + carry;
            
            if (result[length - 1] >= 10) {
                length++;
            }
            
            if (result[j] >= 10) {
                carry = result[j] / 10;
                result[j] %= 10;
                last_index = j;
            }
            
            if (j > last_index) {
                carry = 0;
            }
        }
    }
    
    for (int i = length - 1; i >= 0; i--) {
        printf("%d", result[i]);
    }
    
    return 0;
}

소수 판별 알고리즘

효율적인 소수 판별 함수 구현:

#include <math.h>

int check_prime(int num) {
    if (num <= 1) return 0;
    if (num <= 3) return 1;
    if (num % 2 == 0 || num % 3 == 0) return 0;
    
    for (int i = 5; i * i <= num; i += 6) {
        if (num % i == 0 || num % (i + 2) == 0) {
            return 0;
        }
    }
    return 1;
}

동적 메모리 할당

배열과 다차원 배열에 대한 동적 메모리 할당 예제:

#include <stdlib.h>

// 1차원 배열 할당
int *numbers = (int *)malloc(3 * sizeof(int));

// 2차원 배열 할당
int rows, cols;
printf("행과 열의 개수를 입력하세요:\n");
scanf("%d %d", &rows, &cols);

int **matrix = (int **)malloc(rows * sizeof(int *));
for (int i = 0; i < rows; i++) {
    matrix[i] = (int *)malloc(cols * sizeof(int));
}

퀵 정렬 함수(qsort)

C 표준 라이브러리의 qsort 함수 사용법:

#include <stdio.h>
#include <stdlib.h>

int compare(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

int main() {
    int data[] = {88, 56, 100, 2, 25};
    int size = sizeof(data)/sizeof(data[0]);
    
    printf("정렬 전: ");
    for (int i = 0; i < size; i++) {
        printf("%d ", data[i]);
    }
    
    qsort(data, size, sizeof(int), compare);
    
    printf("\n정렬 후: ");
    for (int i = 0; i < size; i++) {
        printf("%d ", data[i]);
    }
    
    return 0;
}

문자열에서 단일 문자 찾기

문자열에서 처음으로 한 번만 나타나는 문자를 찾는 프로그램:

#include <stdio.h>
#define MAX_LEN 100000

int main() {
    char input[MAX_LEN];
    int frequency[26] = {0};
    
    scanf("%s", input);
    
    for (int i = 0; input[i] != '\0'; i++) {
        frequency[input[i] - 'a']++;
    }
    
    for (int i = 0; input[i] != '\0'; i++) {
        if (frequency[input[i] - 'a'] == 1) {
            printf("%c", input[i]);
            return 0;
        }
    }
    
    printf("no");
    return 0;
}

문자열 배열 선언

두 가지 방식의 문자열 배열 선언:

// 고정 길이 문자열 배열
char text_array[3][100] = {
    "hello",
    "world",
    "C언어"
};

printf("문자열 목록:\n");
for (int i = 0; i < 3; i++) {
    printf("%s\n", text_array[i]);
}
// 포인터 배열을 통한 문자열 저장
const char *text_pointers[] = {
    "hello",
    "world",
    "C언어"
};

int count = sizeof(text_pointers) / sizeof(text_pointers[0]);

printf("문자열 목록:\n");
for (int i = 0; i < count; i++) {
    printf("%s\n", text_pointers[i]);
}

자릿수 분석 프로그램

정수의 각 자릿수를 추출하고 출력하는 프로그램:

#include <stdio.h>
#include <math.h>

int main() {
    int number;
    
    printf("0~9999 범위의 정수를 입력하세요:\n");
    scanf("%d", &number);
    
    if (number < 0 || number > 9999) {
        printf("입력 범위를 초과했습니다.\n");
        return 1;
    }
    
    int digit_count = 0;
    int temp = number;
    
    if (number == 0) {
        digit_count = 1;
    } else {
        while (temp > 0) {
            temp /= 10;
            digit_count++;
        }
    }
    
    printf("자릿수: %d\n", digit_count);
    printf("각 자릿수:\n");
    
    for (int i = digit_count - 1; i >= 0; i--) {
        int digit = (number / (int)pow(10, i)) % 10;
        printf("%d\n", digit);
    }
    
    return 0;
}

출력 형식 지정

왼쪽 정렬 및 자릿수 맞춤 출력:

#include <stdio.h>

int main() {
    int a, b, c;
    
    printf("세 개의 정수를 입력하세요 (예: 1 23 456):\n");
    scanf("%d %d %d", &a, &b, &c);
    
    // 세 자리로 맞춰 앞에 0 추가
    printf("%03d-%03d-%03d\n", c, a, b);
    
    return 0;
}

입력 버퍼 관리

scanf 사용 시 발생하는 버퍼 문제 해결:

int num;
char ch;

scanf("%d", &num);
getchar(); // 줄바꿈 문자 제거

scanf("%c", &ch); // 정상적으로 문자 읽기

태그: C math-functions memory-allocation qsort prime-numbers

6월 4일 03:07에 게시됨