首先显示1024范围内的所有素数,然后显示输入的数是否是素数。1024 是代码中计算的素数的范围,可以修改。
计算平方根,是为了确定一个基数的范围。1024的平方根是32,两个超过32 的数相乘,肯定大于1024,所以基数的范围是2-32,倍数的范围是基数的倍数小于1024。
思路是:把所有基数的所有倍数在BitArray里面的值设置为false,BitArray中为true的下标,即为素数。
1 public class BitArrayClass
2 {
3 public static void FindPrimeNum(int val)
4 {
5 BitArray bitSet = new BitArray(1024, true);
6
7 BuildSieve(bitSet);
8
9 Console.WriteLine();
10 if (bitSet.Get(val))
11 {
12 Console.Write(val + ":true");
13 }
14 else
15 {
16 Console.Write(val + ":false");
17 }
18 }
19
20 private static void BuildSieve(BitArray bits)
21 {
22 string primes = string.Empty;
23
24 //初始化时设置默认值
25 //for (int i = 0; i <= bits.Count - 1; i++)
26 //{
27 // bits.Set(i, true);
28 //}
29
30 int lastBit = int.Parse(Math.Sqrt(bits.Count).ToString());
31
32 for (int i = 2; i <= lastBit; i++)
33 {
34 if (bits.Get(i))
35 {
36 for (int j = 2; j < bits.Count; j++)
37 {
38 int k = i * j;
39 if (k < bits.Count)
40 {
41 bits.Set(k, false);
42 }
43 else
44 {
45 break;
46 }
47 }
48 }
49 }
50
51 int counter = 0;
52 for (int i = 1; i < bits.Count; i++)
53 {
54 if (bits.Get(i))
55 {
56 primes += i.ToString();
57 counter++;
58 if ((counter % 7) == 0)
59 {
60 primes += "\n";
61 }
62 else
63 {
64 primes += " ";
65 }
66 }
67 }
68
69 Console.Write(primes);
70 }
71 }