열혈 C 프로그래밍 - 도전! 프로그래밍1

도전1

10진수 정수를 입력 받아서 16진수로 출력하는 프로그램을 작성해 보자. 이는 서식문자의 활용에 대한 문제이므로 쉽게 해결할 수 있을 것이다.

#include <stdio.h>

int main() {
int a;
scanf("%d", &a);
printf("%x", a);
return 0;
}

16진수의 출력은 %x 또는 %X로 가능하다.

도전2

프로그램 사용자로부터 두 개의 정수를 입력받아서 구구단을 출력하는 프로그램을 작성해 보자. 예를 들어서 프로그램 사용자가 3과 5를 입력하면 3단, 4단, 5단이 출력되어야 하고, 2와 4를 입력하면 2단, 3단, 4단이 출력되어야 한다. 단 한가지 조건이 있다. 사용자는 두 개의 숫자를 입력 할 때에 입력 순서에 자유로워야 한다. 즉 3과 5를 입력하건 5와 3을 입력하건 프로그램은 같은 결과를 출력해야 한다.

#include <stdio.h>

int main() {
	int a, b;
	printf("Enter two integers.\\n> ");
	scanf("%d %d", &a, &b);
	if (a > b) {
		int c = a;
		a = b;
		b = c;
	}
	for (int i = a; i <= b; i++) {
		printf("\\n%d단\\n", i);
		for (int j = 1; j <= 9; j++) {
			printf("%d x %d = %d\\n", i, j, i * j);
		}
	}
	return 0;
}

큰 수가 먼저 입력되었을 경우, 두 수의 순서를 바꿔주면 간단하다. 이후 for문을 이용해 결과를 출력한다.

도전3

두 개의 정수를 입력 받아서 최대 공약수(GCD)를 구하는 프로그램을 작성 해 보자.

#include <stdio.h>

int main() {
	int a, b, gcd = 1;
	printf("두 개의 정수 입력: ");
	scanf("%d %d", &a, &b);
	for (int i = 1; i <= a && i <= b; i++) {
		if (a % i == 0 && b % i == 0) gcd = i;
	}
	printf("두 수의 최대공약수: %d", gcd);
	return 0;
}

for문을 이용해 i를 증가시키며 a를 나눴을 때, b를 나눴을 때 모두 나머지가 0이 나오는 수를 gcd에 저장한다.

도전4

필자가 좋아하는 것 중 하나가 금요일 저녁 퇴근길에 DVD나 만화책을 잔뜩 빌리고, 동네 슈퍼에 들려서 군것질거리를 사가지고 집에 들어가는 것이다. 오늘은 금요일이다. 현재 필자의 주머니에는 5천원이 있다. DVD 한편을 빌리려면 3,500원이 남는다. 슈퍼에 들려서 크림빵(500원), 새우깡(700원), 콜라(400원)를 사려한다. 잔돈을 하나도 남기지 않고 이 세가지 물건을 하나 이상 반드시 구매하려면 어떻게 구매를 진행해야 하겠는가? 물론 여기에는 여러 가지 경우의 수가 있을 것이다. 필자가 어떠한 선택을 할 수 있는지 여러분이 제시해 주기 바란다.

#include <stdio.h>

int main() {
	int m, i = 1, j = 1, k = 1;
	printf("현재 당신이 소유하고 있는 금액 : ");
	scanf("%d", &m);
	for (int i = 1; 500 * i + 700 * j + 400 * k <= 3500; i++) {
		for (int j = 1; 500 * i + 700 * j + 400 * k <= 3500; j++) {
			for (int k = 1; 500 * i + 700 * j + 400 * k <= 3500; k++) {
				if (500 * i + 700 * j + 400 * k == 3500) printf("크림빵 %d개, 새우깡 %d개, 콜 라 %d개\\n",i,j,k);
				else continue;
			}
		}
	}
	printf("어떻게 구입하시겠습니까?");
	return 0;
}