반응형
  • 대량의 범위 안에서 소수들을 판별할때 사용
  • 체를 쳐내듯이 합성수를 하나하나 지워나가며 소수만을 골라냄

 

 

/*
The Sieve of Erathosthenes 
에라토스테네스의 체

대량의 소수를 한꺼번에 판별할 수 있는 알고리즘

*/

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

int number = 100000; //범위
int a[100001]; //수들을 넣을 배열

// 간단한 소수 판별 알고리즘
bool isPrimeNumber(int _x)
{
	int end = (int)sqrt(_x);

	for (int i = 2; i <= end; i++)
	{
		if (_x % i == 0)
		{
			return false;
		}
	}
	return true;
}

//에라토스테네스의 체
void primeNumberSieve()
{
	//초기화, 배열을 2부터 시작해서 정해진 범위까지 채워넣기
	for (int i = 2; i <= number; i++)
	{
		a[i] = i;
	}

	//합성수들을 지우기, 합성수 : 1과 자기자신 이외의 약수의 개수가 3개 이상인 자연수
	for (int i = 2; i <= number; i++)
	{
		if (a[i] == 0) //이미 지워진 수는 제외
		{
			continue;
		}
		
		for (int j = i + i; j <= number; j += i)
		{
			a[j] = 0; // 합성수들을 지우기
		}
	}

	for (int i = 2; i <= number; i++)
	{
		if (a[i] != 0) //지워진 수들을 제외하고 출력, 소수들을 출력
		{
			printf("%d ", a[i]);
		}
	}


}


int main()
{
	//printf("%d", isPrimeNumber(97));
	primeNumberSieve();
	return 0;
}

위의 코드에서 합성수들을 지우는 과정을 살펴보면

i와 j가 일정한 규칙으로 초기화가 되는데 아래와 같다

 

i == 2, j == 4
i == 2, j == 6
i == 2, j == 8
i == 2, j == 10
i == 2, j == 12
i == 2, j == 14
i == 2, j == 16
i == 2, j == 18

i == 3, j == 6
i == 3, j == 9
i == 3, j == 12
i == 3, j == 15
i == 3, j == 18
i == 3, j == 21
i == 3, j == 24
i == 3, j == 27
...

위처럼 2의 배수, 3의 배수 등등 어떤 소수의 배수들로 j가 초기화 되고, 그런 j들을 배열에서 지워준다

그렇게 배열에 소수만 남게 된다

 

 

 

참고자료 : https://blog.naver.com/ndb796/221233595886

반응형
반응형

어처구니 없는 경우는 보통, 오타로 인한 실수가 많은데, 이번에 hlsl 파일을 작성 하면서

발생한 경우다

 

Diffuse, Normal, Specular 샘플 파일들이 적절히 어우러진 결과가 나와야 하는데, Specular 샘플만 나오고 있다

어떠한 경고메시지나 에러메시지도 안나오고, 작성한 hlsl 파일에도 문제 없어 보였는데, 알고보니 정말 한 글자 차이로 발생한 문제였다,,,

 

 

 

정상 작동 화면

위에 코드를 보면 주석처리 한 코드가 실수 코드인데 자세히 보면, * 를 해야 되는데 +를 타이핑 한것이다, 아마도 글자가 너무 작아서 보이지 않았던 것 같다, 이런 경우들을 겪게 되면, 언리얼 엔진에서 Material을 만들때 마인드 맵처럼 작성하기 편하게 되어있는 시스템이, 이런 어처구니 없는 오타를 줄여주는 이점도 있는 것 같다, 이거때문에 4일을 날리다니 ㅠㅠ

 

 

 

언제나 에러메시지, 경고메시지도 안나오는데, 의도한 결과대로 안나온다면, 오타를 의심하자

반응형
반응형

반응형

+ Recent posts