VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > c#编程 >
  • C#教程之C#查找素数实现方法

本文所述为C#查找素数的程序代码,包括了可视化窗体的代码,找素数的方法可以借鉴。虽然实现的功能简单,不过为了演示一些C#技巧,本文实例中还用到了线程技术、ListBox列表框的使用、设置程序挂起等操作,其中备有详尽的注释,帮助大家更好的理解。

具体实现代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Threading;
namespace SuspendAndResume
{
 public class Form1 : System.Windows.Forms.Form
 {
 private System.Windows.Forms.Label label1;
 private System.Windows.Forms.ListBox listBox1;
 private System.Windows.Forms.Button button1;
 private System.Windows.Forms.Button button2;
 private System.Windows.Forms.Button button3;
 private System.Windows.Forms.Button button4;
 private System.Windows.Forms.Label label2;
 private System.Windows.Forms.Timer timer1;
 private System.ComponentModel.IContainer components;
 //公共委托,用于输出素数
 public delegate void UD(string returnVal);
 //声明私有线程
 private Thread pNT;
 //用于标识是否挂起线程
 bool suspend = false;
 //用于标识线程时候开始运行
 bool pNTstart = false;
 public Form1()
 {
  InitializeComponent();
  // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
 }
 protected override void Dispose( bool disposing )
 {
  if( disposing )
  {
  if (components != null)
  {
   components.Dispose();
  }
  }
  base.Dispose( disposing );
 }
 #region Windows 窗体设计器生成的代码
 private void InitializeComponent()
 {
  this.components = new System.ComponentModel.Container();
  this.label1 = new System.Windows.Forms.Label();
  this.listBox1 = new System.Windows.Forms.ListBox();
  this.button1 = new System.Windows.Forms.Button();
  this.button2 = new System.Windows.Forms.Button();
  this.button3 = new System.Windows.Forms.Button();
  this.button4 = new System.Windows.Forms.Button();
  this.label2 = new System.Windows.Forms.Label();
  this.timer1 = new System.Windows.Forms.Timer(this.components);
  this.SuspendLayout();
  // label1
  this.label1.Location = new System.Drawing.Point(8, 8);
  this.label1.Name = "label1";
  this.label1.TabIndex = 0;
  this.label1.Text = "已找到的素数:";
  // listBox1
  this.listBox1.ItemHeight = 12;
  this.listBox1.Location = new System.Drawing.Point(8, 32);
  this.listBox1.MultiColumn = true;
  this.listBox1.Name = "listBox1";
  this.listBox1.Size = new System.Drawing.Size(272, 136);
  this.listBox1.TabIndex = 1;
  // button1
  this.button1.Location = new System.Drawing.Point(19, 184);
  this.button1.Name = "button1";
  this.button1.Size = new System.Drawing.Size(48, 23);
  this.button1.TabIndex = 2;
  this.button1.Text = "创建";
  this.button1.Click += new System.EventHandler(this.button1_Click);
  //
  // button2
  //
  this.button2.Location = new System.Drawing.Point(88, 184);
  this.button2.Name = "button2";
  this.button2.Size = new System.Drawing.Size(48, 23);
  this.button2.TabIndex = 3;
  this.button2.Text = "挂起";
  this.button2.Click += new System.EventHandler(this.button2_Click);
  //
  // button3
  //
  this.button3.Location = new System.Drawing.Point(157, 184);
  this.button3.Name = "button3";
  this.button3.Size = new System.Drawing.Size(48, 23);
  this.button3.TabIndex = 4;
  this.button3.Text = "恢复";
  this.button3.Click += new System.EventHandler(this.button3_Click);
  //
  // button4
  //
  this.button4.Location = new System.Drawing.Point(226, 184);
  this.button4.Name = "button4";
  this.button4.Size = new System.Drawing.Size(48, 23);
  this.button4.TabIndex = 5;
  this.button4.Text = "销毁";
  this.button4.Click += new System.EventHandler(this.button4_Click);
  //
  // label2
  //
  this.label2.Location = new System.Drawing.Point(24, 224);
  this.label2.Name = "label2";
  this.label2.Size = new System.Drawing.Size(200, 23);
  this.label2.TabIndex = 6;
  this.label2.Text = "线程未启动";
  //
  // timer1
  //
  this.timer1.Enabled = true;
  this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
  //
  // Form1
  //
  this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
  this.ClientSize = new System.Drawing.Size(292, 266);
  this.Controls.Add(this.label2);
  this.Controls.Add(this.button4);
  this.Controls.Add(this.button3);
  this.Controls.Add(this.button2);
  this.Controls.Add(this.button1);
  this.Controls.Add(this.listBox1);
  this.Controls.Add(this.label1);
  this.Name = "Form1";
  this.Text = "素数";
  this.Load += new System.EventHandler(this.Form1_Load);
  this.ResumeLayout(false);
 }
 #endregion
 /// <summary>
 /// 应用程序的主入口点。
 /// </summary>
 [STAThread]
 static void Main()
 {
  Application.Run(new Form1());
 }
 private void button1_Click(object sender, System.EventArgs e)
 {
  //创建线程实例,设置属性
  pNT = new Thread(new ThreadStart(GPN));
  pNT.Name = "Prime Numbers Exaple";
  pNT.Priority = ThreadPriority.BelowNormal;
  //设置按键,停用开始按键,启用挂起按键和销毁按键
  button1.Enabled = false;
  button2.Enabled = true;
  button4.Enabled = true;
  //线程开始,并设置标识
  pNT.Start();
  pNTstart = true;
 }
 private void button2_Click(object sender, System.EventArgs e)
 {
  //设置挂起bool变量为真
  suspend = true;
  //设置按键,停用挂起按键, 启用恢复按键
  button2.Enabled = false;
  button3.Enabled = true;
 }
 private void button3_Click(object sender, System.EventArgs e)
 {
  //设置挂起bool变量为假
  suspend = false;
  //当线程当前状态为挂起时,恢复该线程
  if(pNT.ThreadState == System.Threading.ThreadState.Suspended
  || pNT.ThreadState == System.Threading.ThreadState.SuspendRequested)
  {
  try
  {
   //恢复线程
   pNT.Resume();
   //设置按键,停用恢复按键,启用挂起按键
   button3.Enabled = false;
   button2.Enabled = true;
  }
  catch(ThreadStateException Ex)
  {
   MessageBox.Show(Ex.ToString(), "提示");
  }
  }
 }
 private void button4_Click(object sender, System.EventArgs e)
 {
  //设置按键,启用开始按键,停用其他按键
  button1.Enabled = true;
  button2.Enabled = false;
  button3.Enabled = false;
  button4.Enabled = false;
  //销毁线程
  pNT.Abort();
 }
 //GPN为GetPrimeNumber的缩写,用于查找并显示素数
 public void GPN()
 {
  //声明变量
  long Counter;  //素数个数
  long NumberNow;  //当前数
  long SqrtOfNow;  //辅助数,做数组下标
  bool IsPrime = false; //标识是否为素数
  //数组,用于存储已找到素数
  long[] PrimeArray = new long[256];
  //委托,用于显示素数,即将其添加到ListBox中
  string[] args = new string[] {"2"};
  UD UIDel = new UD(UpdateUI);
  //初始化,从3开始计算,从第2个素数开始计算
  NumberNow = 3;
  Counter = 2;
  //添加2为素数,放入素数数组并将其显示
  PrimeArray[1] = 2;
  this.Invoke(UIDel, args);
  //循环,用于找到并输出256个素数
  while(Counter <= 255)
  {
  IsPrime = true;
  //从1到当前数的平方根,穷尽计算是否为素数
  for(SqrtOfNow = 1; (PrimeArray[SqrtOfNow]
   * PrimeArray[SqrtOfNow] <= NumberNow);
   SqrtOfNow++)
  {
   //若能被已找到的素数整除,则不是素数
   if(NumberNow % PrimeArray[SqrtOfNow] == 0)
   {
   //若不是素数,跳出for循环
   IsPrime = false;
   break;
   }
  }
  //若为素数,将其添加到ListBox以显示
  if(IsPrime)
  {
   //将素数存入数组中储存
   PrimeArray[Counter] = NumberNow;
   Counter++;
   //将素数显示到ListBox中
   args[0] = NumberNow.ToString();
   this.Invoke(UIDel,args);
   //利用bool变量,控制是否挂起线程
   if( suspend == true)
   {
   //调用Suspend方法,并捕捉异常
   try
   {
    pNT.Suspend();
   }
   catch(ThreadStateException Ex)
   {
    MessageBox.Show(Ex.ToString(), "提示");
   }
   }
   //使线程睡眠,使过程清楚显示,且有时间挂起线程
   Thread.Sleep(500);
  }
  //除2外,素数必为奇数,故跳过偶数的检查,优化算法
  NumberNow += 2;
  }
 }
 //更新ListBox的方法
 void UpdateUI(string result)
 {
  listBox1.Items.Add(result);
 }
 //利用Timer控件显示线程当前状态
 private void timer1_Tick(object sender, System.EventArgs e)
 {
  //在线程开时候再获取状态并显示
  if( pNTstart )
  {
  label2.Text = "线程当前状态是:" + pNT.ThreadState.ToString();
  }
 }
 private void Form1_Load(object sender, System.EventArgs e)
 {
  //设置按键,启用开始按键,停用其他按键
  button1.Enabled = true;
  button2.Enabled = false;
  button3.Enabled = false;
  button4.Enabled = false;
 }
 }
}

感兴趣的读者可以动手调试一下该程序代码,相信会有一定的启发与借鉴价值。


相关教程