1. 程式人生 > >求N個數以內的質數

求N個數以內的質數

沒事在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個一行我不會寫,看了這個程式碼才會,汗顏。。。
平安夜,敲敲程式碼就是我的蘋果,每天學習一點,每天寫程式碼我相信我會一步一步的成為大牛。