대학교/프로그래밍랩

[프로그래밍 랩] 2주차 - C언어 복습 2

CodeJin 2021. 9. 11. 17:27

 

문제 1.

다음과 같이 2 ~ 100 까지 수 중에서 솟수(1과 자기 자신 외에 약수가 없는 수)를 모두 출력하고, 그 소수들의 합을 구하는 프로그램을 작성하시오. 솟수인지 아닌지 판단하는 함수 isPrime(int n)을 작성해서 이용할 것. isPrime(int n) n이 솟수이면 1, 솟수가 아니면 0return 한다.

소수 판정에 관한 문제. 에라토스테네스의 체 등, 여러가지 효율적인 알고리즘이 존재하지만, 여기서는 그냥 나누는 방법을 써보자. 소수는 1과 자기 자신만을 약수로 가지는 수이므로, 2부터 나누어 보면서 나누어 떨어지면 0을 반환한다.

 

기본적으로는 2 ~ n까지 나누어 보면서 검사하지만, 사실은 sqrt(n)까지만 나누어도 충분하다. n = ab라고 한다면, n이 정해져 있기 때문에 a와 b 둘중 하나가 결정되면 남은 하나는 자동적으로 결정된다. 따라서 a(또는 b)가 sqrt(n)을 넘어선다면, a와 b가 바뀔 뿐, 나눴던 행위를 다시 하는 셈이기 때문이다.

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

int isPrime(int n) // 솟수 검사 함수, 솟수이면 1 아니면 0을 return
{
    if (n == 1)
        return 0;
    else {
        for (int i = 2; i * i <= n; i++) {
            if (n % i == 0)
                return 0;
        }
    }
    return 1;
}

void main() // 2 ~ 100 소수 찾아서 출력하고 더하기
{
    int i, sum = 0;
    for (i = 2; i <= 100; i++) {
        // isPrime()을 이용해서 솟수이면 출력하고 sum 에 더한다.
        if (isPrime(i)) {
            printf("%d ", i);
            sum += i;
        }
    }
    printf("\n");
    printf("sum=%d\n", sum);
}

 

문제 2.

완전수란 어떤 정수의 약수를 모두 더했을 때 자기 자신과 같은 수를 말한다. 예를 들어 6의 약수 1, 2, 3을 더하면 6으로 정수 자신이 되는 수이다. 다음 화면과 같이 2 ~ 10,000 사이의 수 중에서 완전수를 구해서 출력하는 프로그램을 작성하시오.

 

// Lab02-2 완전수 구하기
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void main()
{
	int n, i, j, sum;
	int ndiv, div[5000]; // 약수 보관 장소
	n = 10000;
	for (i = 2; i <= n; i++) {
		sum = 0; // 
		ndiv = 0; // 약수의 갯수를 초기화 한다.
		// 2 ~ i/2 수 중에서 i의 약수를 구해서 sum 에 더하고 div[]에 저장한다
		for (j = 1; j <= i / 2; j++) {
			if (i % j == 0) {
				sum += j;
				div[ndiv++] = j;
			}
		}
		// i == sum 이면 완전수 이므로 i와 div[]를 6 = 1 + 2 + 3 식으로 출력한다.	
		if (i == sum) {
			printf("%d = ", i);
			for (j = 0; j < ndiv; j++) {
				printf(j == ndiv - 1 ? "%d \n" : "%d + ", div[j]);
			}
		}
	}
}

 

문제 3.

매클로린 급수에 관한 문제. e^x의 급수식 자체를 구현하는 게 아니라 x/n에서 n을 계속 증가시키면서 항에 곱하고, 그 값을 더한다.

// Lab02-3 exp(e, x) 구하기
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>

double myexp(int x) // 매클로린 급수
{
	int n;
	double term, sum, oldsum;
	oldsum = 0.0;
	sum = 1.0;
	term = 1.0;
	// for n=1 term > 0.0000001 일 때 까지
	// n를 증가시키면서
	for (n = 1; term > 0.0000001; n++) {
	// term =  을 구한다.
	// sum = sum + term 으로 누적 값을 구한다.
		term *= ((double)x / n);
		sum += term;
	}
	
	return sum;
}

void main()
{
	int i;
	printf("  exp() : ");
	for (i = 1; i <= 5; i++)
		printf("%lf ", exp((double)i));
	printf("\n");
	printf("myexp() : ");
	for (i = 1; i <= 5; i++)
		printf("%lf ", myexp(i));
	printf("\n");
}

 

문제 4.

파일을 이용한 입/출력 처리. 두 정수를 입력받아 합과 곱을 출력하는 프로그램을 입력은 input.txt, 츨력은 output.txt 를 이용하여 처리. (입력/출력이 1 set 인 경우)

 

문제만 들어보면 파일 입출력에 관한 문제인 것 같지만, 사실은 I/O redirection을 배우기 위한 문제. 사실 문제도 아니긴 하다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void main()
{
	int x, y;
	scanf("%d %d", &x, &y);
	printf("%d %d\n", x+y, x*y);
}

 

문제 5.

파일 입출력(I/O redirection)을 통해 두수의 합, 곱을 출력한다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void main()
{
	int i, T, x, y;
	scanf("%d", &T);
	for (i = 0; i < T; i++) {
		scanf("%d %d", &x, &y);
		printf("%d %d\n", x + y, x * y);
	}
}

 

 

문제 6.

정수 배열을 입력받아 총점, 최대값, 최소값을 출력하는 프로그램을 작성하시오. 입력과 출력은 다음과 같다. input.txtT 개의 test set 이 입력으로 주어지고 각각의 test case 에는 다시 K개의 정수가 주어진다. output.txt에는 매 test 마다 한줄씩 총점, 최대값, 최소값을 출력한다.

(Hint: K개의 data를 입력받기 위해 malloc(K * sizeof(int)) 로 메모리를 할당 받고, free로 메모리를 반환하여야 함)

input.txt output.txt
3
3
11 22 33
4
2 5 7 3
6
10 30 11 22 44 33
66 33 11
17 7 2
150 44 10

동적 할당에 관한 복습 문제. 

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

void main()
{
	int i, j, T, K, sum, min, max;
	int* data;
	scanf("%d", &T); // 테스트 케이스의 수 3

	for (i = 0; i < T; i++) {
		sum = 0;
		// 데이타 갯수 K 를 입력을 받고
		scanf("%d", &K);
		// malloc()으로 data[] 공간 확보
		data = malloc(K * sizeof(int));
		// for j = 0 ~ K-1 까지
		for (j = 0; j < K; j++) {
			// data[j] 입력
			scanf("%d", &data[j]);
			// sum 누적
			sum += data[j];
		}
		// max, min 을 찾는다
		max = data[0];
		min = data[0];
		for (j = 1; j < K; j++) {
			max = max < data[j] ? data[j] : max;
			min = min > data[j] ? data[j] : min;
		}
		// sum, max, min 을 출력한다.
		printf("%d %d %d\n", sum, max, min);
		// free()로 data 공간 반환
		free(data);
	}
}

 

 

문제 7.

https://codejin.tistory.com/36

 

백준 10250번 C언어 풀이

https://www.acmicpc.net/problem/10250 10250번: ACM 호텔 프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T 개의 테스트 데이터로 이루어져 있는데 T 는 입력의 맨 첫 줄에 주어진다. 각

codejin.tistory.com