https://www.acmicpc.net/problem/1929
1929번: 소수 구하기
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
www.acmicpc.net
문제
M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
출력
한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.
일단 전의 보수문제에서 한단계 업그레이드 된거네?
그럼 일단 보수들을 전부뽑는 변수를 만들고
입력한 M과 N 사이의 값만 가져오게 하면 될거같은데..
보수는 자기자신과 1로만 되는거 전부다 나누었을때 총 2번만 나누어지면 된다.
for문을 두번써야할거같다.
정수 1부터 1000000 까지 돌리면서 또 안에 for 문으로 나머지연산자를 통해 소수를 구하면 될거같은데..
일단 내가 구상한 알고리즘
에러가 겁나게 뜬다...
chatgpt형님의 기술을 빌려 에러를 고쳐보자.
이 부분의 알고리즘을 수정해보자.
아 모르겠다. 걍 해설 봐야겠다 후. 많이생각했어.
정답
#include <iostream>
using namespace std;
#define MAX 1000000
int arr[MAX + 1]{ 0, };
int main()
{
int m, n;
cin >> m >> n;
for (int i = 2; i <= n; i++)
{
arr[i] = i;
}
for (int i = 2; i * i <= n; i++)
{
if (arr[i] == 0)
{
continue;
}
for (int j = i * i; j <= n; j += i)
{
arr[j] = 0;
}
}
for (int i = m; i <= n; i++)
{
if (arr[i] != 0)
{
cout << arr[i] << '\n';
}
}
return 0;
}
#define Max 10000000 으로 최대치를 정의했고..
int arr[Max+1]{0,}; //{0,} 이 뭔가 했더니 배열의 모든 수를 0 으로 초기화 해주는거네 ㅋㅋ 굿
for (int i = 2; i <= n; i++)
{
arr[i] = i;
}
arr[i] = i ; //for 문을 돌리면서 i번째 배열에 넣으면서 쭉쭉 넣는다. n까지만.
내가 했던 방법은 최적화가 안되어있었을것이다.
for (int i = 2; i * i <= n; i++)
{
if (arr[i] == 0)
{
continue;
}
for (int j = i * i; j <= n; j += i)
{
arr[j] = 0;
}
}
이건 뭔지 이해가 도저히안되네.
뭔가 했더니
에라토스테네스의 체<< 라는 소수구하는 공식을 이용한거였다. 공부하자!
for (int i = m; i <= n; i++)
{
if (arr[i] != 0)
{
cout << arr[i] << '\n';
}
}
return 0;
m부터 n까지 한번씩 돌려서
배열에서 0이 아닐경우 출력을 시킨다.
느낀점
엄청 머리를 쥐어짜내 만들었지만 오류투성이에 최적화도안되어있고 원하는 답도 안나왔다.
나도 언젠간 성장할수있을까 ㅠ
'코딩' 카테고리의 다른 글
백준 10810 c++ (0) | 2023.06.19 |
---|---|
백준 4948 c++ (0) | 2023.06.16 |
백준 1978 c++ (0) | 2023.06.14 |
백준 8393 c++ (0) | 2023.06.12 |
백준 9012 c++ (0) | 2023.06.11 |