求N個數以內的質數
阿新 • • 發佈:2019-01-09
沒事在C#吧解決些小問題,鞏固下基礎。
需求:
計算N以內的全部質數,並寫入文字檔案中。格式,每行10個數,每個數佔7列。最後另起一行輸出100萬以內有多少個質數。
所用到的主要知識點:
1:質數的演算法
2:不足10位的用空格補齊 PadRight或者string.Format({0,10},sum)
3:StreamWriter
Count.cs類 質數演算法類
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace num
{
public class Count
{
private int num1 = 1;
public int Num
{
get { return num1; }
set { num1 = value; }
}
public virtual string CountNum()
{
return "1";
}
}
public class Countprime:Count
{
public override string CountNum()
{
string num2 = "";
int i, j;
for ( i = 2; i <= Num; i++)
{
for ( j = 2; j <=i-1; j++)
{
if (i % j == 0)
{
break;
}
}
if (i == j)
{
string num = Convert.ToString(i);
if (num.Length < 10)
{
num = num.PadRight(10);
}
else
{
num = num.Substring(0, 9);
}
num2 = num2 + num + ",";
}
}
return num2;
}
}
}
客戶端程式碼:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace num
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnCount_Click(object sender, EventArgs e)
{
Countprime ct = new Countprime();
ct.Num = Convert.ToInt32(tbNum.Text);
string num=ct.CountNum();
string []num1=num.Split(',');
using (StreamWriter sw = new StreamWriter(@"D:\1.txt"))
{
int t = 1;
for (int i = 0; i <= num1.Length-1; i++)
{
string a = num1[i];
sw.Write(num1[i]);
t++;
if (t == 10)
{
i = i + 1;
sw.WriteLine(num1[i]);
t = 1;
}
}
int count = Convert.ToInt32(num1.Length) - 1;
sw.Write("");
sw.WriteLine("從1到" + ct.Num + "中有" + count+"個質數");
MessageBox.Show("寫入OK");
}
}
}
}
產生的問題:
窗體類中sw.Write(“”);這句不寫,那麼下一句就不會寫到下一行,很奇怪,至今沒弄明白。
執行效果圖:
專案目錄圖:
吧裡其他同學的答案:
using System;
using System.Collections;
using System.IO;
using System.Text;
namespace Test
{
class Program
{
static void Main(string[] args)
{
int max = 2000000;
int x = 1000000;
int sum = 0;
// 以位元陣列存放素數以節省記憶體
BitArray array = GetPrimes(max);
// 應用程式路徑
string folder = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
try
{
FileStream file = File.Open(folder + "Test.txt", FileMode.Create);
Action<string> write = (str) =>
{
byte[] stream = Encoding.UTF8.GetBytes(str);
file.Write(stream, 0, stream.Length);
};
for (int i = 2, t = 0; i <= max; i++)
{
if (array[i] == true)
{
if (i <= x)
{
sum++;
}
write(string.Format("{0,7}", i));
t++;
}
if (t == 10)
{
write("\r\n");
t = 0;
}
}
write(string.Format("\r\n{0,7}", sum));
file.Close();
}
// IOException
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}
public static BitArray GetPrimes(int max)
{
int size = max + 2;
BitArray array = new BitArray(size, true);
int t = (int)Math.Sqrt(max);
for (int i = 4; i <= max; i += 2)
{
array[i] = false;
}
for (int i = 3; i <= t; i++)
{
if (array[i] == true)
{
for (int j = i * i; j <= max; j += i)
{
array[j] = false;
}
}
}
return array;
}
}
}
總結:
看了其他同學的答案後,覺得比我寫的好多了,還有最開始的時候每10個一行我不會寫,看了這個程式碼才會,汗顏。。。
平安夜,敲敲程式碼就是我的蘋果,每天學習一點,每天寫程式碼我相信我會一步一步的成為大牛。