하루 한 접시
[백준] 4134번: 다음 소수 [C#]
NaZZU
2024. 3. 30. 23:25
int형 만으로는 처리할 수 없는 큰 수가 입력으로 주어진다.
주어진 값을 소수인지 판별하고, 소수가 아니라면 가장 가까운 소수를 출력해주면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
using System.IO;
using System.Text;
using System.Linq;
using System.Reflection.PortableExecutable;
using System.Security.Cryptography;
namespace 연습장
{
internal class Program
{
static void Main(string[] args)
{
using var reader = new StreamReader(Console.OpenStandardInput());
using var print = new StreamWriter(Console.OpenStandardOutput());
StringBuilder sb = new StringBuilder();
int T = int.Parse(reader.ReadLine());
for (long i = 0; i < T; i++)
{
long num = long.Parse(reader.ReadLine());
while (is_Prime(num))
{
num++;
}
sb.Append(num + "\n");
}
print.WriteLine(sb);
}
static bool is_Prime(long num)
{
if (num <= 1)
{
return true;
}
bool is_prime = false;
for (long i = 2; i < Math.Sqrt(num); i++)
{
if (num % i == 0)
{
is_prime = true;
break;
}
}
return is_prime;
}
}
}
|
cs |
처음에 제출했을때 남색 글씨로 '런타임 에러' 가 떴는데, 당연히 시간초과겠구나 생각해서 제대로 읽어보지도 않고 시간을 줄일 방법을 고민했었다. 그런데, 이미 소수 찾는 과정은 엄청나게 시간을 줄여놓았으니, 수정할 부분은 가장 가까운 소수를 찾는 부분이라고 생각했다. 그래서 대안인 '에라토스테네스의 체' 라는 방법을 사용해보려 했다.
그런데, 주어지는 입력이 너무나 커서 미리 계산해놓는 방법이 더 손해인거 같았다. 혹시 몰라 다시 제출 내용을 봤더니
'런타임 에러(Overflow)' 였다;;;
생각해보니 주어지는 값이 너무 커서 21억 정도까지 밖에 표현을 못하는 int형으로는 당연히 오버플로우가 나는 것 이었다.
그래서 모든 변수를 long형으로 바꿔 주었는데 또 오버 플로우가 뜨는것이었다;;;;
너무 당황스러워서 뭐지 하고 있었는데... 알고보니 long형 변수를 선언해두곤 정작 입력을 받을 때에는 int형으로 받는 찐빠를 저질러 놓았던 거였다..
바보