01. 소수 구하기( <-> 합성수)

소수 : 1과 자기 자신 외에 약수가 없는 수

int isPrime(int n) {
	for (int i = 2; i <= n / 2; i++) 
		if (n % i == 0)
			return 0;
	return 1;
}

 

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

 

#include <stdio.h>

int isPrime(int n) {
	for (int i = 2; i <= n / 2; i++) 
		if (n % i == 0)
			return 0;
	return 1;
}

void main() {
	int i, sum = 0;
	for (i = 2; i <= 100; i++) {
		if (isPrime(i)) {
			printf("%d ", i);
			sum += i;
		}
	}
		printf("\n");
		printf("sum=%d\n", sum);
}

 

 

+범위를 입력받을경우 

  • 입력받은 값이 2보다 작을 경우
    기존 함수의 경우 ~ 1 도 소수 인정하기 때문에
    if ( n < 2) return 0; 을 추가해야함

  • n1 > n2일 경우
    n1과 n2의 값을 바꿔줘야 함

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


void swap(int* a, int* b);
int isPrime(int n);

void main() {
	int i, sum = 0, n1, n2, temp;

	printf("소수를 구할 정수의 범위를 작은 수와 큰 수의 순서로 입력(예: 2 100): ");
	scanf("%d %d", &n1, &n2);

	if (n1 > n2) { // n1의 값이 n2의 값보다 클 경우
		swap(&n1, &n2);
	}


	for (i = n1; i <= n2; i++) {
		if (isPrime(i)) {
			printf("%d ", i);
			sum += i;
		}
	}
	printf("\n");
	printf("sum((%d ~ %d)의 소수 합)=%d\n", n1, n2, sum);
}

void swap(int* a, int* b) {
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

int isPrime(int n) {
	if (n < 2) return 0; // n이 2보다 작으면 소수가 아니므로 0을 반환

	for (int i = 2; i <= n / 2; i++)
		if (n % i == 0)
			return 0;
	return 1;
}

01-1.합성수 구하기  (<-> 소수)

합성수: 약수가 3개 이상인 자연수, 즉 1과 자기 자신 외에도 다른 약수를 가지는 자연수

int isComposite(int n) {
	for (int i = 2; i <= n / 2; i++) 
		if (n % i == 0)
			return 1;
	return 0;
}

 


02. 완전수 찾기 (+ 동적 할당 활용해보기)

 

완전수: 자기 자신을 제외한 약수(진 약수)의 합이 자기 자신과 같은 자연수

 

과정

  • 1~ n/2 사이의 수 중에서 n의 약수이면 sum에 더한다
  • sum == n 이면 완전수 임

 

  • 어떤 수가 완전수인지 판단하는 것 + 완전수의 공약수 출력 
    문제: 화면과 같이 출력하려면?
                6 = 1+2+3
    ->약수들을 int divisors[]에 보관한다.

 

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

#include <stdio.h>

#define SIZE 100

void print_array(int divisor[], int count);


void main() { 
	int i, j, sum, temp;
	int divisor[SIZE], count = 0;

	for (i = 1; i <= 10000; i++) {
		sum = 0;
		for (j = 1; j <= i / 2; j++) {
			if (i % j == 0){
				sum += j;
			}
		}
		if (i == sum) {
			for (j = 1, count = 0; j <= i / 2; j++) {
				if (i % j == 0)
					divisor[count++] = j;
			}
			printf("%d = ", i);
			print_array(divisor, count);

		}
	}
}

void print_array(int divisor[], int count) {
	for (int i = 0; i < count; i++) {
		printf("%d ", divisor[i]);
		if (i < count - 1) // 마지막을 제외하고 + 출력
			printf("+ ");
	}
	printf("\n");
}

함수로 정리

#include <stdio.h>

#define SIZE 100

int sum_properdivisor(int n);
int insert_divisor(int* divisor, int n);
void print_array(int divisor[], int count);


void main() {
	int i, j, sum, temp;
	int divisor[SIZE], count = 0;

	for (i = 1; i <= 10000; i++) {
		sum = sum_properdivisor(i);

		if (i == sum) {
			count = insert_divisor(divisor, i);
			printf("%d = ", i);
			print_array(divisor, count);

		}
	}
}
int sum_properdivisor(int n) {
	int sum = 0;
	for (int i = 1; i <= n / 2; i++) {
		if (n % i == 0) {
			sum += i;
		}
	}

	return sum;
}

int insert_divisor(int* divisor, int n) {
	int count = 0;
	for (int i = 1; i <= n / 2; i++) 
		if (n % i == 0) 
			divisor[count++] = i;

	return count;
}

void print_array(int divisor[], int count) {
	for (int i = 0; i < count; i++) {
		printf("%d ", divisor[i]);

		if (i < count - 1) // 마지막을 제외하고 + 출력
			printf("+ ");
	}
	printf("\n");
}

 

 

+범위를 입력 받는 경우

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

#define SIZE 100

void swap(int* a, int* b);
void print_array(int divisor[], int count);


void main() { 
	int i, j, sum, temp;
	int n1, n2;
	int divisor[SIZE], count = 0;

	printf("완전수를 구할 정수의 범위를 작은 수와 큰 수의 순서로 입력(예:1 10000): ");
	scanf("%d %d", &n1, &n2);
    
    if (n1 < 1 || n2 < 1) { // 값이 1미만일 경우
		return;
	}

	if (n1 > n2) { //n1의 값이 n2의 값보다 클 경우
		swap(&n1, &n2);
	}

	for (i = n1; i <= n2; i++) {
		sum = 0;
		for (j = 1; j <= i / 2; j++) {
			if (i % j == 0){
				sum += j;
			}
		}
		if (i == sum) {
			for (j = 1, count = 0; j <= i / 2; j++) {
				if (i % j == 0)
					divisor[count++] = j;
			}
			printf("%d = ", i);
			print_array(divisor, count);

		}
	}
}

void swap(int* a, int* b) {
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}


void print_array(int divisor[], int count) {
	for (int i = 0; i < count; i++) {
		printf("%d ", divisor[i]);
		if (i < count - 1) // 마지막을 제외하고 + 출력
			printf("+ ");
	}
	printf("\n");
}

 

함수로 정리

#include <stdio.h>

#define SIZE 100

void swap(int* a, int* b);
int sum_properdivisor(int n);
int insert_divisor(int *divisor, int n);
void print_array(int *divisor, int count);



void main() { 
	int i, j, sum;
	int n1, n2;
	int divisor[SIZE], count;

	printf("완전수를 구할 정수의 범위를 작은 수와 큰 수의 순서로 입력(예:1 10000): ");
	scanf("%d %d", &n1, &n2);

	if (n1 < 1 || n2 < 1) // 값이 1미만일 경우
		return;


	if (n1 > n2) {
		swap(&n1, &n2); //n1의 값이 n2의 값보다 클 경우
	}

	for (i = n1; i <= n2; i++) {
		sum = sum_properdivisor(i);

		if (i == sum) {
			count = insert_divisor(divisor, i);
			printf("%d = ", i);
			print_array(divisor, count);

		}
	}
}

void swap(int* a, int* b) {
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

int sum_properdivisor(int n) {
	int sum = 0;
	for (int i = 1; i <= n / 2; i++) {
		if (n % i == 0)
			sum += i;
	}
	return sum;
}

int insert_divisor(int* divisor, int n) {
	int count = 0;
	for (int i = 1; i <= n / 2; i++) {
		if (n % i == 0)
		divisor[count++] = i;
	}

	return count;
}



void print_array(int *divisor, int count) {
	for (int i = 0; i < count; i++) {
		printf("%d ", divisor[i]);
		if (i < count - 1) // 마지막을 제외하고 + 출력
			printf("+ ");
	}
	printf("\n");
}

 

+ 동적할당

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

void print_array(int* divisor, int count);
int get_sum(int n);

void main() {
    int i, j, sum, count;
    int size = 10; // 초기 크기 설정
    int* divisor;

    divisor = (int*)malloc(size * sizeof(int)); //

    for (i = 1; i <= 10000; i++) {
        sum = get_sum(i);

        if (i == sum) {
            for (j = 1,count = 0; j <= i / 2; j++) {
                if (i % j == 0) {
                    if (count >= size) { //
                        size *= 2;
                        divisor = (int*)realloc(divisor, size * sizeof(int));
                    }
                    divisor[count++] = j;
                }
            }
            printf("%d = ", i);
            print_array(divisor, count);
        }
    }

    free(divisor);
}

int get_sum(int n) {
    int sum = 0;
    for (int i = 1; i <= n / 2; i++) {
        if (n % i == 0)
            sum += i;
    }
    return sum;
}


void print_array(int* divisor, int count) {
    for (int i = 0; i < count; i++) {
        printf("%d ", divisor[i]);
        if (i < count - 1)
            printf("+ ");
    }
    printf("\n");
}

03. e^x 근사치 계산하기

 

 

 

Lab 5-3) e^x 는 수학적으로 다음과 같이 기술할 수 있다.



n 값을 증가시키면서 의 근사치를 구하는 myexp(int x) 함수를 작성하시오. 의 근사값 오차 범위는 1/10,000,000 로 정하고  값을 구하시오. 즉, (n)번째 합과 (n-1)번째 합의 차이가 0.0000001 이하일 때 까지 n 값을 증가하면서 합을 구한다 (n>12~25 정도에서 끝남). 화면과 같이  ~  값을 math.h 의 exp(x) 값을 호출하여 출력하고 myexp(x) 값을 출력하여 비교하시오.

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

double myexp(int x)
{
	int i;
	double term, sum, oldsum;
	oldsum = 0.0;
	sum = 1.0;
	term = 1.0;
	for (int i = 1; (sum - oldsum) > 0.0000001; i++) { 	// (sum – oldsum) > 0.0000001 일 때 까지 i를 증가시키면서
		term *= (double)x / i;   // term =  을 구한다.
		oldsum = sum;       // oldsum = sum 으로 기억하고
		sum += term;	    // sum = 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");
}

 


04. 파일을 이용한 데이터 입/출력

 

2가지 방법이 있음

  1. (커맨드 창)  C:\>program < input.txt > output.txt 
  2. (Visual Studio) 에서 설정 방법: 속성 - 디버그 - 명령 인수 => < input.txt > output.txt

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

#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);

}



(Lab 5-5) 파일 이용 입/출력, TEST CASE 가 T set인 경우, TEST 마다 입력 DATA는 1 set 인 경우. 

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void main()
{
	int i, n_test, x, y;
	scanf("%d", &n_test);
	for (i = 0; i < n_test ; i++) {
		scanf("%d %d", &x, &y);
		printf("%d %d\n", x + y, x * y);
	}
}

 

 

 

(Lab 5-6) 정수 배열을 입력받아 총점, 최대값, 최소값을 출력하는 프로그램을 작성하시오. 입력과 출력은 다음과 같다. input.txt로 T 개의 test set 이 입력으로 주어지고 각각의 test case 에는 다시 k개의 정수가 주어진다. output.txt에는 매 test 마다 한줄씩 총점, 최대값, 최소값을 출력한다.
(Hint: k개의 data를 입력받기 위해 malloc(k * sizeof(int)) 로 메모리를 할당 받고, free로 메모리를 반환하여야 함)

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

int find_max(int* p, int n);
int find_min(int* p, int n);

void main(){
	int n_test, n_data, sum, min, max;
	int* p = NULL;

	scanf("%d", &n_test);
	for (int i = 0; i < n_test; i++) {
		sum = 0;
		scanf("%d", &n_data);
		p = (int*)malloc(sizeof(int)* n_data);
		for (int j = 0; j < n_data; j++) {
			scanf(" %d", &p[j]);
			sum += p[j];
		}
		max = find_max(p, n_data);
		min = find_min(p, n_data);

		printf("%d %d %d\n", sum, max, min);
		free(p);
	}
}

int find_max(int* p, int n) {
	int max = p[0];
	for (int i = 1; i < n; i++) {
		if (max < p[i])
			max = p[i];
	}
	return max;
}

int find_min(int* p, int n) {
	int min = p[0];
	for (int i = 1; i < n; i++) {
		if (min > p[i])
			min = p[i];
	}
	return min;
}

 

(Lab 5-7) ACM 프로그래밍 대회 2014 예선문제. 호텔 객실 배정 프로그램. T 개의 입력, H, W, N 입력 (H: Hotel의 층수, W: 층당 객실수, N 번째 도착한 손님). 출력은 각 입력에 해당되는 방 번호.(별지참조)

(방법 1)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	int T, H, W, N;
	int x, y;

	scanf("%d", &T);
	for (int i = 0; i < T; i++) {
		scanf("%d %d %d", &H, &W, &N);

		if (W * H <= N) {
			printf("수용 인원을 넘어섰습니다. \n");
			continue;
		}

		y = N % H;
		x = (N / H) + 1;

		if (y == 0) {
			y = H;   
			x = N / H;
		}

		printf("%d%02d\n", y, x);

	}

}

 

(방법 2)

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

int main() {
int T, H, W, N;
int** p = NULL;
int y, x;

scanf("%d", &T);
for (int i = 0; i < T; i++) {
scanf("%d %d %d", &H, &W, &N);


p = (int**)malloc(sizeof(int*) * H);
for (int j = 0; j < H; j++) {
p[j] = (int*)malloc(sizeof(int) * W);
}


for (int j = 0; j < H; j++) {
for (int k = 0; k < W; k++) 
p[j][k] = (j + 1) * 100 + (k + 1);
}


y = (N - 1) % H;
x = (N - 1) / H;

printf("%d\n", p[y][x]);


for (int j = 0; j < H; j++) {
free(p[j]);
}
free(p);
}
}

+ Recent posts