본문 바로가기
ProgrammingLanguage/C언어

C언어 | 동적 메모리 할당 예제(2)

by 씽쌩쏭 2021. 2. 18.
728x90

✅ 오늘의 문제 : 소수의 개수 출력하기

 

임의의 N개의 숫자를 입력받고, 그 중에서 소수인 수의 개수를 출력하는 프로그램을 만들어보세요.

 

(코뮤니티 모각코 과정 中 출제되어 푼 문제입니다.)

 

실행예시

 

숫자의 개수 : 5
3
9
13
20
12

소수의 개수는 2입니다.

 

초안

 

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

int main() {

	int num, prinum = 0;
	int j = 0;

	printf("숫자의 개수 : ");
	scanf("%d", &num);

	int* numPtr = malloc(sizeof(int) * num); // (int 크기 * 숫자의 개수)만큼 동적 메모리 할당
	//int* numPtr = calloc(num, sizeof(int))

	for (int i = 0; i < num; i++) {	
		scanf("%d", &numPtr[i]);
		
		//소수 판별
		for (j = 2; j < numPtr[i]; j++) {
			if (numPtr[i] % j == 0) {
				break;
			}
		}

		if (numPtr[i] == j)
			prinum++;
	}

	printf("소수의 개수는 %d개입니다.", prinum);

	free(numPtr);

	return 0;
}

 

소수 판별하기 부분은...😅

처음에 이렇게 짰었다.

 

	for (int i = 0; i < num; i++) {
		for (int j = 2; j <= numPtr[i]; j++) {
			if (numPtr[i] % j == 0) {
				if (numPtr[i] == j)
					prinum++;
			}
		}
	}

 

디버깅 해보니 자꾸 소수의 개수 = 숫자의 개수로 출력되길래

대충 다시 시뮬레이션 돌려보니

모든 숫자가 다 돌아가는 코드였음

 

그래서 초안처럼 수정!

 

숫자 입력받는 반복문 안에서

소수 판별하는 반복문도 추가해서 넣어

결론적으로

입력 -> 판별, 입력 -> 판별, ... , 소수의 개수 출력

 

이렇게 만들었는데,

 

지금은 작은 숫자를 사용하지만

실제로 사용하게 되었을 때

백만 단위의 숫자가 들어오게 되면,

입력받고 판정, 입력받고 판정 할때 걸리는 시간이 거슬릴 것...이라고 함

 

한 번에 입력받고 한 번에 판정받는 걸로 수정 !! 

 

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

int main() {

	int num, prinum = 0;
	int j = 0;

	printf("숫자의 개수 : ");
	scanf("%d", &num);

	int* numPtr = malloc(sizeof(int) * num); // (int 크기 * 숫자의 개수)만큼 동적 메모리 할당
	//int* numPtr = calloc(num, sizeof(int))

	//숫자 입력받기
    for (int i = 0; i < num; i++) {	
		scanf("%d", &numPtr[i]);
	}
	
    //소수 판별
	for (int i = 0; i < num; i++) {
		for (j = 2; j < numPtr[i]; j++) {
			if (numPtr[i] % j == 0) {
				break;
			}
		}

		if (numPtr[i] == j)
			prinum++;
	}

	printf("소수의 개수는 %d개입니다.", prinum);

	free(numPtr);

	return 0;
}

 

출력시 !