using System;
namespace PrimeNumberTest
{
class Program
{
static void Main(string[] args)
{
bool flag = true;
for (int i = 2; i <= 100; i++)
{
for (int j = 2; j < i; j++)
{
if (i % j == 0)
{
flag = false;
}
}
if (flag == true)
{
Console.Write("{0} ", i);
}
flag = true;
}
Console.WriteLine();
}
}
}
다음과 같이 입력을 하면 나름 깔끔한 2~100까지의 소수 찾기 프로그램이 나오게 됩니다.
뭐 위의 소스대로 진행을 하여도 크게 문제는 되지 않을꺼라 생각이듭니다. 하지만 이번에 C# in Depth 책을 보다가 소수를 찾는 소스가 보였습니다. 위의 소스는 우선 C,C++,java 등 모든 소스에서 쉽게 사용할 수 있는 코드이긴 하지만 C#을 한다면 뭔가 더 좋은 코드를 써보아야 되지 않을까요?
그래서 준비한 코드가 이것입니다. 에라토스테네스의 체 라는 소수구하는 방법을 이용한 것이죠. 문법적으로는 제네릭과 델레게이트를 사용하여 첨 접하는 분들에게는 다소 어려울지도 모르겠네요. 하지만 언젠가는 정복해야 되는 것이므로.....
using System;
using System.Collections.Generic;
namespace PrimeNumberTest
{
class Program
{
static void Main(string[] args)
{
List<int> list = new List<int>();
for (int i = 2; i <= 100; i++)
{
list.Add(i);
}
for (int factor = 2; factor <= 100; factor++)
{
list.RemoveAll(delegate(int x) { return x > factor && x % factor == 0; });
}
list.ForEach(delegate(int prime) { Console.Write("{0} ", prime); });
Console.WriteLine();
}
}
}
List<int> 에 2부터 100까지의 수를 입력해 놓고 거기서 에라토스테네스의 체 방법을 사용해서 소수가 아닌 수들을 RemoveAll로 제외시키고 있습니다. 그리고 ForEach 함수를 사용해서 소수만 출력하는 것이지요. 물론 결과는 위 코드와 마찮가지입니다. 어떻게 보면 첫번째 코드가 더 편할 수 있으나 만약 배열이나 리스트에 저장해서 사용해야 되는 값이라면 확실히 두번째 코드가 더 쉽게 구현할 수 있을 것입니다. 물론 선수학습(제네릭, 델레게이트)가 되어 있어야겠지요. ^^
'.NET > C#' 카테고리의 다른 글
try~catch문(예외처리) (3) | 2010.10.14 |
---|---|
스레드 정보 알아오기... (0) | 2010.10.12 |
C# 프로세스 목록 알아오기 (1) | 2010.10.11 |
Thread 란? (0) | 2010.10.10 |
Windows Forms의 시작 (2) | 2010.01.19 |
C# Event (0) | 2010.01.18 |
C# delegate (0) | 2010.01.14 |
FileAndDirectory (0) | 2010.01.12 |
C# File Input/Output (1) | 2009.12.24 |
C# Collection (0) | 2009.12.21 |