본문 바로가기
백준(C언어)/23년 6월

[C] 백준 - 4134번: 다음 소수

by C0MPAS 2023. 6. 26.

6월 26일(월) - 약수, 배수와 소수 2 (4134번)

 

4134번: 다음 소수

정수 n(0 ≤ n ≤ 4*109)가 주어졌을 때, n보다 크거나 같은 소수 중 가장 작은 소수 찾는 프로그램을 작성하시오.

www.acmicpc.net

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

최초 생각 정리

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

문제점

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)

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

int main(void)
{
	long long test_case;
	scanf("%d", &test_case);

	long long number;
	for (int i = 0; i < test_case; i++)
	{
		scanf("%lld", &number);

		long long result;
		while (1)
		{
			for (int j = 2; j <= sqrt((double)number) + 1; j++)
			{
				if (number % j == 0)
				{
					break;
				}
				if (j == sqrt((double)number))
				{
					result = number;
				}
			}
			number++;
		}
		printf("%lld", result);
	}

	return 0;
}

1. 위의 풀이를 제출하게되면, 시간초과가 발생

-> 문제해결 불가

 

2. 230731 풀이 추가

-> test_case마다 입력되는 number가 0, 1, 2인 경우에는 바로 가장 작은 소수로 2를 출력한다

-> 그 이외의 경우에는 이전 풀이에서의 방향성을 유지해서 풀이

-> 다만, while(1)문 안에서 변수 result가 0으로 그대로 넘어오는 경우, 즉 number % j가 0이 되지 못하는 경우

     그 당시의 number를 printf 하고, break하며 빠져나오는 것으로 수정

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

풀이

(230731 풀이 추가)

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)

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

int main(void)
{
	int test_case;
	scanf("%d", &test_case);

	for (int i = 0; i < test_case; i++)
	{
		long long number;
		scanf("%lld", &number);

		if (number == 0 || number == 1 || number == 2)
		{
			printf("%d\n", 2);
			continue;
		}

		while (1)
		{
			int result = 0;
			for (long long j = 2; j <= sqrt((double)number) + 1; j++)
			{
				if (number % j == 0)
				{
					result++;
					break;
				}
			}

			if (result == 0)
			{
				printf("%lld\n", number);
				break;
			}

			number++;
		}

	}

	return 0;
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

댓글