E8本(数学)
次のE8本(数学)の問題へ
前のE8本(数学)の問題へ
E8本(数学) 011 Print Prime Numbers
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "InputX";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("10");
//2 3 5 7
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
int N = int.Parse(InputList[0]);
Eratosthenes(N);
Console.WriteLine(IntEnumJoin(" ", mSosuuArr));
}
////////////////////////////////////////////////////////////////
// セパレータとInt型の列挙を引数として、結合したstringを返す
////////////////////////////////////////////////////////////////
static string IntEnumJoin(string pSeparater, IEnumerable<int> pEnum)
{
string[] StrArr = Array.ConvertAll(pEnum.ToArray(), pX => pX.ToString());
return string.Join(pSeparater, StrArr);
}
static int[] mSosuuArr;
// エラトステネスの篩
static void Eratosthenes(int pJyougen)
{
var IsSosuuArr = new System.Collections.BitArray(pJyougen + 1);
for (int I = 2; I <= IsSosuuArr.Count - 1; I++) {
IsSosuuArr[I] = true;
}
for (int I = 2; I * I <= IsSosuuArr.Count - 1; I++) {
if (IsSosuuArr[I]) {
for (int J = I * 2; J <= IsSosuuArr.Count - 1; J += I) {
IsSosuuArr[J] = false;
}
}
}
var SosuuList = new List<int>();
for (int I = 2; I <= IsSosuuArr.Count - 1; I++)
if (IsSosuuArr[I]) SosuuList.Add(I);
mSosuuArr = SosuuList.ToArray();
}
}
解説
エラトステネスの篩を使ってます。