사이먼's 코딩노트
[C언어] 함수 문제풀이(2) / 서식지정자와 자료형 본문
- 지난번에 이어 함수와 관련된 몇 가지 문제를 더 풀어보자.
[문제 1]
- 입력받은 숫자가 10이라고 할때 1부터 10 사이에 존재하는 모든 소수의 개수와 합을 출력하는 함수를 구현해보자.
#include <stdio.h>
#pragma warning (disable: 4996)
int is_prime_number(int num) {
if(num < 2) {
return 0;
}
for(int i = 2; i < num; i++) {
if(num % i == 0) {
return 0;
}
}
return 1;
}
int get_1_to_n_prime_numbers_count(int n) {
int count;
for(int i = 1; i <= n; i++) {
if(is_prime_number(i)) {
count++;
}
}
return count;
}
int get_1_to_n_prime_numbers_sum(int n) {
int sum;
for(int i = 1; i <= n; i++) {
if(is_prime_number(i)) {
sum += i;
}
}
return sum;
}
int main() {
int count;
int number;
int sum;
number = 1000;
count = get_1_to_n_prime_numbers_count(number);
sum = get_1_to_n_prime_numbers_sum(number);
printf("1부터 %d사이에 존재하는 소수의 개수 : %d개\n", number, count);
printf("1부터 %d사이에 존재하는 소수의 개수 : %d개\n", number, sum);
// 출력 => 1부터 1000사이에 존재하는 소수의 개수 : 168개
// 출력 => 1부터 1000사이에 존재하는 소수의 합 : 76127
number = 2000;
count = get_1_to_n_prime_numbers_count(number);
sum = get_1_to_n_prime_numbers_sum(number);
printf("1부터 %d사이에 존재하는 소수의 개수 : %d개\n", number, count);
printf("1부터 %d사이에 존재하는 소수의 개수 : %d개\n", number, sum);
// 출력 => 1부터 2000사이에 존재하는 소수의 개수 : 303개
// 출력 => 1부터 2000사이에 존재하는 소수의 합 : 277050
return 0;
}
- 소수를 판별하는 함수인 is_prime_number() 함수를 만들어준다.
- 범위 안에 소수의 개수를 세기 위해서는 get_1_to_n_prime_numbers_count() 함수를 만들어주고 count라는 변수를 생성하여 1부터 범위까지 반복문을 통해 만약 소수이면 count를 1씩 증가하게 하여 count를 return 해준다.
- 범위 안에 소수의 합을 계산하기 위해서는 get_1_to_n_prime_numbers_sum() 함수를 만들어주고 sum이라는 변수를 생성하여 1부터 범위까지 반복문을 통해 만약 소수이면 sum에 해당 소수를 더하여 sum을 return 해준다.
[문제 2]
- 정수 a, b 두개의 값을 입력받고, 두 수의 공약수를 모두 출력하는 함수를 구현해보자.
#include <stdio.h>
void print_num_common_divisor(int num1, int num2) {
for(int i = 1; i <= num2; i++) {
if(num1 % i == 0 && num2 % i == 0) {
printf("%d와 %d의 공약수 : %d\n", num1, num2, i);
}
}
}
int main(void) {
int a;
int b;
printf("두 수를 입력하세요 : ");
scanf("%d %d", &a, &b);
print_num_common_divisor(a, b);
return 0;
}
- 두 수의 정수의 값을 사용자 임의로 입력하기 위해서는 main 함수에서 scanf를 사용한다.
- scanf는 해당 서식지정자에 주소를 가르키는 &를 사용하여 작성한다.
- 두 수의 공약수는 각 숫자의 공약수 중 공통으로 속한 값이다.
- 공약수를 구하는 함수는 print_num_common_divisor() 함수를 만들고 입력받은 두 값이 1부터 범위까지의 숫자까지 반복하여 나눴을 때 나머지가 0이면 공약수로 판별한다.
[문제 3]
- 정수 a, b 두개의 값을 입력받고, 두 수의 최대공약수를 모두 출력하는 함수를 구현해보자.
#include <stdio.h>
int print_num_common_divisor(int num1, int num2) {
int max_divisor = 0;
for(int i = 1; i <= num2; i++) {
if(num1 % i == 0 && num2 % i == 0) {
if(max_divisor <= i) {
max_divisor = i;
}
}
}
return max_divisor;
}
int main(void) {
int a;
int b;
printf("두 수를 입력하세요 : ");
scanf("%d %d", &a, &b);
print_num_common_divisor(a, b);
printf("%d와 %d의 최대공약수 : %d\n", a, b, print_num_common_divisor(a, ));
return 0;
}
- 두 수의 정수의 값을 사용자 임의로 입력하기 위해서는 main 함수에서 scanf를 사용한다.
- 최대 공약수는 공약수 중에 가장 큰 값을 의미한다.
- 최대 공약수를 구하는 print_num_common_divisor() 함수를 만들고 먼저 반복문을 통해 공약수를 구하고 max_divisor라는 변수를 생성하여 조건문을 통해 해당 공약수가 가장 큰 값인지 비교하여 가장 큰 값을 max_divisor에 넣고 retrun 한다.
[문제 4]
- 정수 a의 값을 입력받고, 랜덤숫자를 맞추는 함수를 구현해보자.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int check_random(int x, int y) {
if (x == y) {
printf("random 숫자 %d를 맞추셨습니다!!.\n", x);
return 1;
} else if (x > y) {
printf("입력하신 값이 random보다 작습니다. 다시 시도하세요.\n");
// printf("랜덤 숫자는 %d 입니다\n", x);
} else if (x < y) {
printf("입력하신 값이 random보다 큽니다. 다시 시도하세요.\n");
}
return 0;
}
int main(void) {
int random_num;
int a;
// 1부터 100까지의 랜덤숫자 추출
srand(time(NULL));
random_num = rand() % 100 + 1;
while (1) {
printf("숫자를 입력하세요 : ");
scanf("%d", &a);
if (check_random(random_num, a) == 1) {
break;
}
}
return 0;
}
- 먼저 랜덤숫자를 얻기 위해서 <stdlib.h>와 <time.h> 헤더를 포함한다.
- 랜덤함수를 추출하는 방법은 srand(time(NULL))와 1부터 100까지의 숫자 중 하나라면 random_num이라는 변수를 생성하고 random_num = rand()%100+1를 작성한다.
- 사용자가 입력한 값이 랜덤함수에서 추출된 숫자와 일치할 때까지 무한으로 반복문을 실행해야되기 때문에 무한루프인 while(1) 반복문 안에 scanf와 숫자를 체크하는 함수인 check_random()를 만들어준다.
- check_random() 함수가 참일 때, 즉 숫자를 맞췄을 때 break를 걸어 반복문이 종료되고 해당 프로그램이 종료된다.
- check_random() 함수는 입력받은 값과 랜덤숫자를 조건문을 통해 두 수의 값이 같은지 작은지 큰지를 확인한다.
[서식지정자와 자료형]
- 정수형 타입을 가지는 자료형은 char, int, short, long, float, double 등이 있다.
- char는 문자를 나타내는 자료형으로 알고있지만 사실 C언어에서는 문자가 존재하지 않기 때문에 char도 정수 타입으로 취급당한다. char는 1바이트로 8비트의 크기를 가지고있다.
- short는 2바이트로 16비트의 크기를 가지고있다.
- int는 4바이트로 32비트의 크기를 가지고있어 대략 -21억에서 21억까지의 숫자 범위를 가진다.
- int보다 더 큰 숫자를 정의할 때는 long 자료형을 사용한다.
#include <stdio.h>
int main(void) {
int k = 500000000;
printf("%d\n", k);
char age = 'd';
printf("%c\n", age);
char a = 'a';
printf("%c\n", a);
printf("%c\n", a + 1);
printf("%c\n", a + 2);
return 0;
}
- 예시와 같이 문자 'd'를 char로 age라는 변수를 선언하여 넣었을 때 출력문에서 문자를 출력하는 방법은 서식지정자를 %d가 아닌 %c로 작성해야한다.
- 문자를 %d로 출력하게 되면 'd'의 아스키코드 값인 100이 출력이된다.
- 문자 'a'의 아스키코드 값은 97이고 예시와 같이 a, a+1, a+2로 출력문에서 출력하게 되면 컴퓨터는 97이라는 숫자를 기준으로 계산을 하기 때문에 a = 97, a+1 = 98, a+2 = 99가 되고 이는 문자로 출력했을 때 'a', 'b', 'c' 로 출력된다.
- char : %c
- short : %hd
- int : %d, %ld
- unsigned int : %u
- float : %f
- double : %lf
- long : %ld
반응형
'C언어' 카테고리의 다른 글
[C언어] 포인터 문제풀이 (0) | 2024.02.02 |
---|---|
[C언어] 포인터 (0) | 2024.02.02 |
[C언어] 함수 문제풀이(1) (0) | 2024.01.24 |
[C언어] 함수 (1) | 2024.01.23 |
[C언어] 반복문(for, while) (0) | 2024.01.19 |