수학 함수 사용법
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); // 정상적으로 문자 읽기