본문 바로가기
STUDY/C

[모각코 C언어 메이트 심화편] 동적 메모리 할당 | 응용문제 : 소수 갯수 출력하기

by 23g 2022. 2. 24.

 

원래 동적 메모리 글을 연달아서 올렸어야 하는데

실수로 다음글을 먼저 올려버렸네요!!!

 

쩔 수 없이 동적 메모리 응용 문제 글을

다음 순서에 업로드합니다~~

 

처음 작성한 잘못된 코드

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

int main(void)
{
	int N;
	int* arr;
	int count = 0, sum = 0;

	printf("숫자의 갯수 : ");
	scanf("%d", &N);

	//printf("\n");

	arr = (int*)malloc(sizeof(int) * N);
	//arr = (int*)calloc(std, sizeof(int));

	for (int i = 0; i < N; i++)
	{
		//N은 숫자의 갯수
		//printf("%d", i + 1);
		scanf("%d", &arr[i]);

		for (int j = 1; j <= arr[i]; j++) {
			if ((arr[i] / j) == 0) {
				count++;
			}
		}

	}

	if (count == 2) {
		sum++;
	}
	free(arr);

	//avg = sum / N;

	printf("소수의 갯수는 %d", sum);

	return;

}
 

쳇,, 왜 안되는 거야~ ㅎ

라면서

패기롭게 소수 구하는 변수

대충 sum으로 갈겨놓기,,^^

머어땨용 ㅠㅠ

이 아니라 prime으로 바꾸겟음니다..

for (int j = 1; j <= arr[i]; j++) {
			if ((arr[i] / j) == 0) {count++;}}}
	if (count == 2) {sum++;}
	free(arr);
	printf("소수의 갯수는 %d", sum);
 

입력받은 숫자를 j로 나눠서

딱 떨어지는 j가 두개가 나오면

=소수면

sum(여기선 소수의 총 갯수를 지칭..^^)

을 ++하려는 비장한 계획이었으나

 

소수 갯수 : 0이라는 결과만 나와서

대실패

 

두번째 시도

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

int main(void)
{
	int N; //숫자의 갯수
	int* arr;
	int j;

	int prime = 0;

	printf("숫자의 갯수 : ");
	scanf("%d", &N);

	//printf("\n");

	arr = (int*)malloc(sizeof(int) * N);
	//arr = (int*)calloc(std, sizeof(int));

	for (int i = 0; i < N; i++)
	{
		//N은 숫자의 갯수
		//printf("%d", i + 1);

		scanf("%d", &arr[i]);

		for (j = 1; j <= arr[i]; j++) {
			if ((arr[i] / j) == 0) {
				break;
			}
		}

		if (j == arr[i]) {
			prime++;
		}
	}

	printf("소수의 갯수는 %d", prime);
	free(arr);
	return 0;
}
 

여러 예시들을 참조하여

여기까지는 수정 성공,,,

 

arr[i]를 j로 나누었을 때

0이 되면 for문 탈출

이때 arr[i]==j 면

소수라고 판단!

 

하지만 아무리 해도

소수의 갯수는 0만 나왔다 ㅠㅠ

도대체 뭐가 잘못된거지,,?

생각하며 보던중,,

 

엄청난 실수들 발견!!! ㅠ

for (j = 1; j <= arr[i]; j++) {
			if ((arr[i] / j) == 0) {
				break;
			}
		}
 

바로 j=1 , j <= arr[i] , arr[i] / j

...

일단 1로 나눴을때는 당연히

나머지가 0이기 때문에

2부터 시작

마찬가지로 arr[i]랑 같은 수인 j로

나눠도 무조건 나머지가 0이기 때문에

arr[i]전까지

 

그리고 대망의,,,

/는 나눴을 때의 몫 값

%는 나눴을 때의 나머지 값..^^

어떻게 이런 실수를 할 수가 있지,,,

따흐흐흐그흐긓ㄱ

 

/ 입력해놓고 안된다며 울부짖고 있었음!

 

그렇게 완성한 최종코드!

 

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

int main(void)
{
	int N; //숫자의 갯수
	int* arr;
	int j;

	int prime = 0;

	printf("숫자의 갯수 : ");
	scanf("%d", &N);

	//printf("\n");

	arr = (int*)malloc(sizeof(int) * N);
	//arr = (int*)calloc(std, sizeof(int));

	for (int i = 0; i < N; i++)
	{
		scanf("%d", &arr[i]);

		for (j = 2; j < arr[i]; j++) {
			if (arr[i] % j == 0) {
				break;
			}
		}

		if (j == arr[i]) {
			prime++;
		}
	}

	printf("소수의 갯수는 %d", prime);
	free(arr);
	return 0;
}
 

결과