본문 바로가기
문제풀이/문제풀이 중심의 C 언어 연습

[C] [문제풀이 중심의 C 언어 연습] 6장 실습 문제 Part 2

by 민됴리 2020. 8. 23.
반응형

1999년 9월 1일에 발행된

김용일, 강문설 저자의

문제풀이 중심의 C언어 연습

6장 실습 문제 Part 2입니다.

6장은 문제가 특별히 많아서

Part 1과 Part 2로 나눠서 작성했습니다.

 

Part 1은 1번부터 20번까지

Part 2는 21번부터 34번까지

포함돼있습니다.

 

책에 오타나 오류가 있는 문제가 적지 않게 있는데

그런 부분에 대해서는 언급해 드리겠습니다.

 

궁금한 점은 댓글로 남겨주세요.

 


 

6-21. 1 + (1 + 2) + (1 + 2 + 3) + ... + (1 + 2 + 3 + ... + 9 + 10)의 중간 과정과 결과 출력

#include <stdio.h>

int main(void) {

	int total = 0;
	int count = 0;

	while (count < 10) {
		count++;
		if (count == 1)
			total = 1;

		printf("1 ");
		for (int i = 2; i <= count; i++) {

			if (i == count) {
				for (int j = 1; j <= i; j++)
					total += j;
			}

			printf("+ (1");
			for (int j = 1; j <= i; j++) {
				if (j == 1)
					continue;
				printf(" + %d", j);
			}
			printf(") ");
		}
		printf("= %d\n", total);
	}

	return 0;
}

 

6-22. 첫항이 1이고 15개의 항을 가진 계차수열의 중간 과정과 결과 출력

#include <stdio.h>

int main(void) {

	int count = 0;
	int initial_term = 1;
	int final_term = 0;
	int total = 0;

	while (count < 15) {

		count++;
		printf("%d", initial_term);

		for (int i = 1; i < count; i++) {
			initial_term += i + 1;
			printf(" + %d", initial_term);
		}

		final_term += count;
		total += final_term;
		initial_term = 1;

		printf(" = %d\n", total);
	}

	return 0;
}

효율도 좋지 않고 깨끗하지 않은 코드입니다.  가장 큰 이유는 15번째 줄의 for문으로 인해서 첫 번째 항부터 count번째 항까지 구하는 과정을 i번 반복해야 하기 때문입니다. 만약 배열을 쓴다면 배열에다가 항을 저장함으로써 불필요한 계산을 크게 줄일 수 있습니다.

 

6-23. 1과 100까지의 합을 매 10항마다 중간 결과를 출력

#include <stdio.h>

int main(void) {

	int total = 0;

	for (int i = 1; i <= 100; i++) {
		total += i;
		if (i % 10 == 0)
			printf("%4d%8d\n", i, total);
	}

	return 0;
}

 

6-24. 1부터 n까지의 합이 500을 넘지 않는 n의 최댓값 구하기

#include <stdio.h>

int main(void) {

	int n = 1;
	int total = 0;
	
	while (total + n < 500) {
		total += n;
		n++;
	}

	printf("최대의 n값: %d\n", n - 1);
	printf("합: %d", total);

	return 0;
}

 

6-25. 양의 정수 n의 소인수분해 결과 출력

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	int num;
	int factor = 2;
	int num2; //num을 factor로 나눈 값을 보관할 변수
	
	printf("정수 입력: ");
	scanf(" %d", &num);
	num2 = num;

	printf("%d의 소인수: ", num);
	while (1) {
		if (num2 % factor == 0) {
			if (num2 / factor == 1) {
				printf("%d", factor);
				break;
			}
			printf("%d * ", factor);
			num2 = num2 / factor;
		}
		else
			factor++;
	}

	return 0;
}

 

6-26. 1과 10 사이의 양의 정수(n)을 입력받고 1에서 100 사이의 n의 배수 모두 출력

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	int num;
	int count = 1;

	printf("입력(양의 정수): ");
	scanf(" %d", &num);
	if ((num < 1) || (num > 10)) {
		printf("입력 오류");
		return 0;
	}

	printf("%d의 배수: %d", num, num);
	while (num * (count + 1) <= 100) {
		count++;
		printf(", %d", num * count);
	}

	printf("\n%d의 배수의 개수: %d", num, count);

	return 0;
}

 

6-27. 1보다 큰 양의 정수가 소수인지 판별

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
	
	int num;
	int prime = 0;

	printf("양의 정수 입력: ");
	scanf(" %d", &num);
	if (num < 1) {
		printf("입력 오류");
		return 0;
	}
	
	if (num == 2) {
		printf("입력한 %d는 소수입니다.", num);
		return 0;
	}
	for (int i = 2; i < num; i++) {
		if (num % i == 0) {
			prime = 1;
			break;
		}
	}

	if (prime)
		printf("입력한 %d는 소수가 아닙니다.", num);
	else
		printf("입력한 %d은 소수입니다.", num);

	return 0;
}

 

6-28. 1과 100사이의 양의 정수(n)을 입력받고, 1과 n사이의 소수들을 출력하고 그 소수들의 합 구하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	int num;
	int prime;
	int total = 0;
	
	printf("입력(양의 정수): ");
	scanf(" %d", &num);
	if ((num > 100) || (num < 1)) {
		printf("입력 오류");
		return 0;
	}
	if ((num == 1) || (num == 2)) {
		printf("%d 보다 작은 소수는 없습니다.", num);
		return 0;
	}

	printf("%d보다 작은 소수: 2", num);
	total += 2;
	for (int i = 3; i < num; i++) {
		prime = 1;
		for (int j = 2; j < i; j++) {
			if (i % j == 0) {
				prime = 0;
				break;
			}
		}
		if (prime) {
			printf(", %d", i);
			total += i;
		}
	}

	printf("\n%d까지의 소수의 합: %d", num, total);

	return 0;
}

 

6-29. 입력받은 양의 정수를 역으로 출력

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

int main(void) {

	int num;
	int reverse = 0;
	int digit = 0;
	int i = 1;
	int temp;

	printf("입력(양의 정수): ");
	scanf(" %d", &num);
	if (num < 0) {
		printf("입력 오류");
		return 0;
	}

	while (1) {	//입력받은 수가 몇 자리 수 인지
		if (num / i == 0) {
			break;
		}
		i *= 10;
		digit++;
	}

	i = 1;
	for (int j = digit - 1; j >= 0; j--) {
		temp = num / pow(10, j);
		num -= temp * pow(10, j);
		reverse += temp * i;
		i *= 10;
	}

	printf("%d를 역으로 출력한 수: %d", num, reverse);

	return 0;
}

 

6-30. ij + ji = 154를 만족하는 모든 조합 구하기

#include <stdio.h>

int main(void) {

	int sum = 154;

	printf("ij + ji = 154\n");
	for (int i = 0; i <= 9; i++) {
		for (int j = 0; j <= 9; j++) {
			if (i * 11 + j * 11 == 154)
				printf("%d%d + %d%d = 154\n", i, j, j, i);
		}
	}

	return 0;
}

 

6-31. 문제에 주어진 결과 출력

#include <stdio.h>

int main(void) {

	for (int i = 0; i <= 4; i++) {
		for (int j = 0; j <= i; j++) {
			printf("%d", j);
		}
		printf("\n");
	}
	for (int i = 3; i >= 0; i--) {
		for (int j = 0; j <= i; j++) {
			printf("%d", j);
		}
		printf("\n");
	}

	return 0;
}

 

6-32. 문제에 주어진 결과 출력

#include <stdio.h>

int main(void) {

	int count = 1;
	int k;

	for (int i = 0; i < 10; i++) {
		for (int j = 9 - i; j > 0; j--)
			printf(" ");

		for (int j = i + 1; j <= count + i; j++) {
			if (j > 9) {
				k = j - 10;
				printf("%d", k);
				continue;
			}
			printf("%d", j);
		}
		for (int j = i + count - 1; j >= count; j--) {
			if (j > 9) {
				k = j - 10;
				printf("%d", k);
				continue;
			}
			printf("%d", j);
		}
		printf("\n");
		count++;
	}

	return 0;
}

개인적으로 난이도가 매우 높았던 문제입니다. 시간을 내서라도 꼭 풀어보시기를 권장합니다.

 

6-33. 0을 입력하기 전까지 입력받은 1과 100 사이의 숫자들의 최솟값과 최댓값 출력

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	int num;
	int biggest = 1;
	int smallest = 100;

	while (1) {
		printf("숫자 입력:");
		scanf("%d", &num);
		if (num == 0)
			break;
		if ((num < 0) || (num > 100)) {
			printf("입력 오류");
			return 0;
		}
		if (num < smallest)
			smallest = num;
		if (num > biggest)
			biggest = num;
	}

	printf("최댓값: %d   최솟값: %d", biggest, smallest);

	return 0;
}

 

6-34. 곱셈표 출력

#include <stdio.h>

int main(void) {

	printf("* ");
	for (int i = 1; i <= 9; i++)
		printf("%2d ", i);
	printf("\n");

	for (int i = 1; i <= 9; i++) {
		printf("%d", i);
		for (int j = 1; j <= 9; j++)
			printf(" %2d", i * j);
		printf("\n");
	}

	return 0;
}

 

반응형