using System;
using System.IO;
using System.Runtime.InteropServices;
namespace EnumPrime
{
class EnumPrime
{
[DllImport("kernel32.dll")]
extern static short QueryPerformanceCounter(ref long x);
[DllImport("kernel32.dll")]
extern static short QueryPerformanceFrequency(ref long x); static void Main()
{
uint num = 0U, top = 0U, n = 0U;
long begintime = 0L, endtime = 0L, freqtime = 0L, resulttime = 0L;
string filename;
do
{
Console.Write("请输入上限: ");
try
{
top = Convert.ToUInt32(Console.ReadLine());
}
catch
{
Console.WriteLine("请正确输入数字!");
continue;
}
if (top < 2)
Console.WriteLine("请输入>=2的值");
} while (top < 2);
Console.Write("请输入保存位置:");
filename = Console.ReadLine();
StreamWriter oufile = null;
try
{
oufile = new StreamWriter(filename);
}
catch
{
oufile = null;
}
QueryPerformanceCounter(ref begintime);
PrimeTable[0] = 3;
for (num = 2; num <= top; ++num)
{
if (TestPrime(num))
{
if (oufile != null)
oufile.Write("{0},", num);
n++;
}
}
QueryPerformanceCounter(ref endtime);
QueryPerformanceFrequency(ref freqtime);
Console.WriteLine("在<={0}时共有{1}个素数", top, n);
if (oufile != null)
{
oufile.WriteLine();
oufile.WriteLine("在<={0}时共有{1}个素数", top, n);
oufile.Close();
Console.WriteLine("结果保存在: {0}", filename);
}
resulttime = (endtime - begintime) * 1000 / freqtime;
Console.WriteLine("处理时间: {0}时{1}分{2}.{3:000}秒", resulttime / 3600000, (resulttime / 60000) % 60, (resulttime / 1000) % 60, resulttime % 1000);
Console.ReadLine();
}
static uint[] PrimeTable = new uint[6543];
static ushort TableIndex = 0;
static bool TestPrime(uint n)
{
uint i = 0;
if (n == 1)
return false;
else if (n == 2)
return true;
if (n % 2 == 0)
return false;
for (i = 0; PrimeTable[i] * PrimeTable[i] <= n; i++)
{
if (n % PrimeTable[i] == 0)
return false;
}
if (n <= 65521)
PrimeTable[TableIndex++] = n;
return true;
}
}
}
Imports System.IO
Imports System.Runtime.InteropServices
Namespace EnumPrime
Class EnumPrime
<DllImport("kernel32.dll")> _
Private Shared Function QueryPerformanceCounter(ByRef x As Long) As Short
End Function
<DllImport("kernel32.dll")> _
Private Shared Function QueryPerformanceFrequency(ByRef x As Long) As Short
End Function
Private Shared Sub Main()
Dim num As UInteger = 0, top As UInteger = 0, n As UInteger = 0
Dim begintime As Long = 0L, endtime As Long = 0L, freqtime As Long = 0L, resulttime As Long = 0L
Dim filename As String
Do
Console.Write("请输入上限: ")
Try
top = Convert.ToUInt32(Console.ReadLine())
Catch
Console.WriteLine("请正确输入数字!")
Continue Try
End Try
If top < 2 Then
Console.WriteLine("请输入>=2的值")
End If
Loop While top < 2
Console.Write("请输入保存位置:")
filename = Console.ReadLine()
Dim oufile As StreamWriter = Nothing
Try
oufile = New StreamWriter(filename)
Catch
oufile = Nothing
End Try
QueryPerformanceCounter(begintime)
PrimeTable(0) = 3
For num = 2 To top
If TestPrime(num) Then
If oufile IsNot Nothing Then
oufile.Write("{0},", num)
End If
n += 1
End If
Next
QueryPerformanceCounter(endtime)
QueryPerformanceFrequency(freqtime)
Console.WriteLine("在<={0}时共有{1}个素数", top, n)
If oufile IsNot Nothing Then
oufile.WriteLine()
oufile.WriteLine("在<={0}时共有{1}个素数", top, n)
oufile.Close()
Console.WriteLine("结果保存在: {0}", filename)
End If
resulttime = (endtime - begintime) * 1000 / freqtime
Console.WriteLine("处理时间: {0}时{1}分{2}.{3:000}秒", resulttime / 3600000, (resulttime / 60000) Mod 60, (resulttime / 1000) Mod 60, resulttime Mod 1000)
Console.ReadLine()
End Sub
Shared PrimeTable As UInteger() = New UInteger(6542) {}
Shared TableIndex As UShort = 0
Private Shared Function TestPrime(ByVal n As UInteger) As Boolean
Dim i As UInteger = 0
If n = 1 Then
Return False
ElseIf n = 2 Then
Return True
End If
If n Mod 2 = 0 Then
Return False
End If
i = 0
While PrimeTable(i) * PrimeTable(i) <= n
If n Mod PrimeTable(i) = 0 Then
Return False
End If
i += 1
End While
If n <= 65521 Then
PrimeTable(System.Math.Max(System.Threading.Interlocked.Increment(TableIndex),TableIndex - 1)) = n
End If
Return True
End Function
End Class
End Namespace
2. Imports System.IO
3. Imports System.Runtime.InteropServices
4.
5.
6. Namespace EnumPrime
7. Class EnumPrime
8. <DllImport("kernel32.dll")> _
9. Private Shared Function QueryPerformanceCounter(ByRef x As Long) As Short
10. End Function
11. <DllImport("kernel32.dll")> _
12. Private Shared Function QueryPerformanceFrequency(ByRef x As Long) As Short
13. End Function
14.
15. Private Shared Sub Main()
16. Dim num As UInteger = 0, top As UInteger = 0, n As UInteger = 0
17. Dim begintime As Long = 0L, endtime As Long = 0L, freqtime As Long = 0L, resulttime As Long = 0L
18. Dim filename As String
19. Do
20. Console.Write("请输入上限: ")
21. Try
22. top = Convert.ToUInt32(Console.ReadLine())
23. Catch
24. Console.WriteLine("请正确输入数字!")
25. Continue Try
26. End Try
27. If top < 2 Then
28. Console.WriteLine("请输入>=2的值")
29. End If
30. Loop While top < 2
31. Console.Write("请输入保存位置:")
32. filename = Console.ReadLine()
33. Dim oufile As StreamWriter = Nothing
34. Try
35. oufile = New StreamWriter(filename)
36. Catch
37. oufile = Nothing
38. End Try
39. QueryPerformanceCounter(begintime)
40. PrimeTable(0) = 3
41. For num = 2 To top
42. If TestPrime(num) Then
43. If oufile IsNot Nothing Then
44. oufile.Write("{0},", num)
45. End If
46. n += 1
47. End If
48. Next
49. QueryPerformanceCounter(endtime)
50. QueryPerformanceFrequency(freqtime)
51. Console.WriteLine("在<={0}时共有{1}个素数", top, n)
52. If oufile IsNot Nothing Then
53. oufile.WriteLine()
54. oufile.WriteLine("在<={0}时共有{1}个素数", top, n)
55. oufile.Close()
56. Console.WriteLine("结果保存在: {0}", filename)
57. End If
58. resulttime = (endtime - begintime) * 1000 / freqtime
59. Console.WriteLine("处理时间: {0}时{1}分{2}.{3:000}秒", resulttime / 3600000, (resulttime / 60000) Mod 60, (resulttime / 1000) Mod 60, resulttime Mod 1000)
60. Console.ReadLine()
61. End Sub
62. Shared PrimeTable As UInteger() = New UInteger(6542) {}
63. Shared TableIndex As UShort = 0
64. Private Shared Function TestPrime(ByVal n As UInteger) As Boolean
65. Dim i As UInteger = 0
66. If n = 1 Then
67. Return False
68. ElseIf n = 2 Then
69. Return True
70. End If
71. If n Mod 2 = 0 Then
72. Return False
73. End If
74. i = 0
75. While PrimeTable(i) * PrimeTable(i) <= n
76. If n Mod PrimeTable(i) = 0 Then
77. Return False
78. End If
79. i += 1
80. End While
81. If n <= 65521 Then
82. PrimeTable(System.Math.Max(System.Threading.Interlocked.Increment(TableIndex),TableIndex - 1)) = n
83. End If
84. Return True
85. End Function
86. End Class
87. End Namespace