通过本文主要向大家介绍了c#求素数,c#输出素数,c#判断素数,c#素数,c#求100以内的素数等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
本文所述为C#查找素数的程序代码,包括了可视化窗体的代码,找素数的方法可以借鉴。虽然实现的功能简单,不过为了演示一些C#技巧,本文实例中还用到了线程技术、ListBox列表框的使用、设置程序挂起等操作,其中备有详尽的注释,帮助大家更好的理解。
具体实现代码如下:
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);
}
//

