소수를 세자. C++로 엔리코 푸치 신부님이 되는 거야.

노들 영산

소수를 세자. C++로 엔리코 푸치 신부님이 되는 거야.

Spread the love

소수 세는 것을 좋아하는 엔리코 푸치 신부님(죠죠의 기묘한 모험:스톤 오션에서/이미지 레퍼런스는 링크 참조)

오래간만에 자습차 Dev-C를 이용해 소수를 세는 C++ 프로그램을 짜 보았습니다.

소수를 가르는 원리는 독일 동화 ‘수학 귀신’에서 소개한 소거법을 떠올렸습니다. 그러나 실제로는 방향을 바꿔서 짰습니다. 1은 소수가 아니니까 먼저 쳐내고, 그 다음 가장 작은 자연수부터 1과 자기 자신 사이의 수로 나머지 없이 나뉘는지를 알아보는 식이죠. 1 초과로 자기 자신 미만으로 나누어 떨어뜨릴 수 있는 수가 나오는 순간 그 수는 소수에서 뺍니다.

<By 출판사 비룡소, 작가 한스 엔첸스베르거, 그림 로트라우트 수잔네 베르거, 공정 이용, https://ko.wikipedia.org/w/index.php?curid=1335331>

수학 귀신에서 쓴 방법은, 1 다음 가장 작은 자연수를 기준수로 놓은 뒤, 오름차순으로 나누어 떨어지는지 아닌지를 판별해 가는 방식입니다. 이 또한 for문의 조합으로 코딩이 가능할 것입니다.

소수 판별기 이외에 어떤 규칙을 가진 수를 뽑는 프로그램이나, 좌표를 가진 수를 가려내는 프로그램에도 도전해 보고 싶네요.

#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;

int main()
{
cout << "<The prime number collector>" << endl;
cout << "Input the natural number to which you want to count the prime number from 1." << endl;
int N; //소수를 세고 싶은 수 범위 
cin >> N;
while(N<2){
	cout << "Please input the natural number again." << endl;
	cout << "You must write it bigger than 1." << endl;
	cin >> N; 
} //2보다 작은 정수를 넣었을 때 출력하는 경고문 
	int array[N][2]; //2차원 배열. 첫 행은 1부터 시작하는 자연수, 다음 행은 그 자연수가 소수인지 아닌지 구별하기 위한 번호표 
	for(int i=0; i<N; i++)
	{
		for(int j=0; j&lt;2; j++)
		{
		if(j==0){
			array[i][j]=i+1; //자연수 모음 
		}
		else{
			array[i][j]=1; //소수 및 소수가 아닌 자연수의 구별 번호표. 소수는 1, 소수가 아닌 자연수는 0. 
		}	
		}	
	}
array[0][1]=0; //1은 소수가 아니므로 항상 제외시키기 위한 재정의 
for(int k=1; k<N; k++) //소수 판별기. 2부터 시작. 
{
	for(int l=0; l<k; l++) //2부터 자기 자신 직전의 자연수까지 나눴을 때 나누어 떨어지는지 파악하기. 
	{
		if(array[l][1]==1) //나누는 수가 소수인지 파악하기. 
		{
	
		if(array[k][0]%(l+1)==0) //나누어지는 수를 소수로 나눴을 때 나누어 떨어진다면? 
		{
			array[k][1]=0; //그 수는 소수가 아니므로 소수가 아니라고 정의한다. 
		}
		}
		}
	}
cout << "These are every prime numbers between 1 and " << N << "." << endl;
for(int m=0; m<N; m++) //소수 나열 출력기 
{
	if(array[m][1]==1) //그 수가 소수인 경우에만 
	{
	cout << array[m][0] << " "; //출력하고 사이를 한 칸 띄어쓰기하기. 
	}	
	}
cout << endl;
system("Pause"); //명령 프롬프트 창이 강제종료되지 않게 하기 위한 장치.	
return 0;
}