※ 해당 코드의 문제는 올리지 않았으니 책을 참고해 주시기 바랍니다.
※ 도전 문제들은 가능하면 직접 풀어보시기 바랍니다.
도전 문제 1.
#include <stdio.h>
int main(void)
{
int num;
printf("10진수 정수 입력: ");
scanf("%d", &num);
printf("16진수로 출력: %x\n", num);
}
설명:
문제 그대로 10진수 정수를 입력하면 16진수 정수로 변환하면 해결된다.
= %x 사용
도전 문제 2.
#include <stdio.h>
void multi(int num1, int num2)
{
int i;
while(num1<=num2)
{
for(i=1; i<10; i++)
{
printf("%d X %d = %d\n", num1, i, num1*i);
}
printf("\n");
num1++;
}
}
int main(void)
{
int a, b;
printf("정수 두개 입력: ");
scanf("%d %d", &a, &b);
if(a<b)
{
multi(a, b);
}
else
{
multi(b, a);
}
return 0;
}
설명:
두 정수의 사이의 구구단을 출력하기 위한 multi 함수 구현.
1) 입력받을 첫 번째 인자 num1: while(num1<=num2)
2) for문을 통해서 곱할 단: for(i=1; i<10; i++)
3) 두 번째 인자 num2와 값이 동일할 때까지 num1++ 증가.
main 함수 구현
1) 입력할 정수 num1과 num2에 저장
2) 문제에서 명시한 조건을 만족하기 위해 if문:
num1<num2의 경우, multi(num1, num2)의 결과값 반환
반대의 경우, multi(num2, num1) 결과값 반환
도전 문제 3
#include <stdio.h>
int GCD(int num1, int num2)
{
int result;
result = (num1<num2) ? num1 : num2;
while(num1%result != 0 || num2%result !=0)
{
result--;
}
return result;
}
int main(void)
{
int a, b;
printf("두 개의 정수 입력: ");
scanf("%d %d", &a, &b);
printf("최대공약수 출력: %d\n", GCD(a, b));
return 0;
}
설명:
최대공약수 GCD의 원리를 파악하고 있으면 쉽게 해결할 수 있는 문제.
함수 GCD 구현
1) 변수 result에 전달할 인자 중 가장 작은 값 저장.
result = (num1<num2) ? num1 : num2;
2) while문을 통해 나누어 떨어지지 않으면 반복하고 약수의 최댓값을 구하기 위해 0으로 나누어 떨어지지 않는 동안 result-- 로 값을 줄임.
도전 문제 4.
#include <stdio.h>
const int bread = 500;
const int shrimp = 700;
const int cola = 400;
int main(void)
{
int money, a, b, c;
printf("현재 당신이 소유하고 있는 금액: ");
scanf("%d", &money);
for(a=1; a<money/bread; a++)
{
for(b=1; b<money/shrimp; b++)
{
for(c=1; c<money/cola; c++)
{
if(money==(bread*a+shrimp*b+cola*c))
{
printf("크림빵 %d개, ", a);
printf("새우깡 %d개, ", b);
printf("콜라 %d개\n", c);
}
}
}
}
printf("어떻게 구입하시겠습니까? \n");
return 0;
}
설명:
입력한 금액을 남기지 않고 위 세 가지 물건을 무조건 각각 하나 이상 구매해야 하는 경우의 수를 구현.
1) 각 물건마다 for문 작성.
최소의 1개 구매일 때, 입력한 금액/물건의 금액이 1개보다 많아야 한다.
2) 입력한 money 값과 구매한 물건의 금액이 동일한 if문 작성
조건문을 만족하는 경우, 즉, 구매하는 물건의 전체 금액과 보유한 금액이 동일한 경우 -> 각 물건의 구매 가능한 개수의 경우의 수 출력.
도전 문제 5.
#include <stdio.h>
int IsPrime(int n)
{
int i;
int result = 0;
for(i=1; i<=n; i++)
{
if(n%i == 0)
{
result++;
}
}
if(result == 2)
{
return 1;
}
return 0;
}
int main(void)
{
int num = 2;
int inc = 0;
while(inc<10)
{
if(IsPrime(num) == 1)
{
printf("%d ", num);
inc++;
}
num++;
}
return 0;
}
설명:
IsPrime 함수 구현 → 전달받은 인자 n이 소수인지 판별하는 목적.
1) for(i=1; i<=n; i++)
정수 n보다 작은 정수로 나눌 때 나누어 떨어지는지 검사하고 나누어 떨어지는 정수는 약수의 개수 증가.
2) if(result == 2)
약수의 개수가 두 개, 즉, 본인과 1(소수)일 때, 1 반환.
Main 함수 구현
1) while(cnt<10)
10개의 소수를 출력하기 위한 조건. 그리고 num의 초기값 2부터 증가.
2) if(IsPrime(num) == 1)
인자 입력 전달 시, 1을 반환하면 num값 출력. 총 10개 출력하기 위해서 cnt++ 증가.
도전 문제 6.
#include <stdio.h>
const int H = 3600;
const int M = 60;
int main(void)
{
int time, h, m, s;
printf("초(second) 입력: ");
scanf("%d", &time);
h = time/H;
time = time%H;
m = time/M;
time = time%M;
s= time;
printf("[h:%d, m:%d, s:%d] \n", h, m, s);
return 0;
}
설명:
이 문제는 함수 구현 없이 바로 main 함수 안에서 쉽게 구현가능.
1) const int H = 3600; const int M = 60;
1시간 = 3600초, 1분 = 60초(전역변수 선언)
2) h = time/H;
입력받은 초(second)를 3600으로 나눈 값을 h변수에 저장. 즉, 이값이 hour(시간).
3) time = time%H;
입력받은 초(second)의 나머지를 구하면 분을 구할 수 있음.
Ex: 3616%3600 = 16분.
도전 문제 7.
#include <stdio.h>
int main(void)
{
int n, k;
int inc =1;
printf("상수 n 입력: ");
scanf("%d", &n);
if(n==0)
{
return 1;
}
for(k=0; inc*2<=n; k++)
{
inc = inc*2;
}
printf("공식을 만족하는 k의 최댓값은? %d\n", k);
return 0;
}
설명:
1) if(n==0)
n=0일 때 프로그램 종료를 시킨다.
2) for(k=0; inc*2<=n; k++)
초기값 1인 inc를 선언하고 이것을 이용해서 k값이 0에서 증가할 때마다증가 => 2, 4, 8…
도전 문제 8.
#include <stdio.h>
int multi(int n)
{
if(n==0)
{
return 1;
}
return multi(n-1)*2;
}
int main(void)
{
int num;
printf("정수 입력: ");
scanf("%d", &num);
printf("2의 %d승은? %d\n", num, multi(num));
return 0;
}
설명:
재귀함수의 개념만 이해하면 쉽게 해결할 수 있다.
multi 함수 구현
1) if(n==0)
2의0 제곱인 경우1 반환하게 한다. 그래야 재귀함수의 종료조건이 성립됨.
2) return multi(n-1)*2;
n=0이 될 때까지 계속해서 2를 곱해 나간다.
'C Programming > 윤성우의 열혈 C 프로그래밍' 카테고리의 다른 글
[열혈 C 코딩] Chapter 9 함수 문제&풀이 (0) | 2025.03.24 |
---|---|
[열혈 c 코딩] Chapter 8 조건문 문제&풀이 (1) | 2025.03.23 |
[열혈 c 코딩] Chapter 7 반복문 문제&풀이 (0) | 2025.03.22 |