国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C#篩法求出范圍內的所有質數

2019-11-17 02:22:52
字體:
來源:轉載
供稿:網友

C#篩法求出范圍內的所有質數

    科普篇:篩法是一種簡單檢定素數的算法。據說是古希臘的埃拉托斯特尼(Eratosthenes,約公元前274~194年)發明的,又稱埃拉托斯特尼篩法(sieve of Eratosthenes).

說實話,之前我在求質數的場合都是驗證某一數是否為質數的,用定義求即可方便的得出結論,代碼如下:

01:  public static bool IsPRime(int n)02:  {//判斷n是否是質數03:      if (n < 2) return false;04:      for (int i = n - 1; i > 1; i--)05:      {//n除以每個比n小比1大的自然數06:          if (n % i == 0)07:          {//如果有能被整除的,則不是質數08:              return false;09:          }10:      }//否則則為質數11:      return true;12:  }

但是用這種方法的話,如果要求兩個數x和y之間的所有質數,就要用循環判斷:

1:  for (int i = x; i < y; i++)2:  {3:      if (IsPrime(i))4:      {5:          Console.Write(i);6:      }7:  }
今天翻書偶然看到了篩法可能更加適合處理這樣的問題--求某上限內的所有質數:
01:  private static List<int> GenPrime(int j)02:  {03:      List<int> ints=new List<int>();04:      BitArray bts=new BitArray(j+1);05:      for (int x = 2; x < bts.Length / 2; x++)06:      {07:          for (int y = x + 1; y < bts.Length; y++)08:          {09:              if (bts[y] == false && y % x == 0)10:              {11:                  bts[y] = true;12:              }13:          }14:      }15:      for (int x = 2; x < bts.Length; x++)16:      {17:          if (bts[x] == false)18:          {19:              ints.Add(x);20:          }21:      }22:      return ints;23:  }

不過如果要求范圍內質數的話也需要求兩個范圍的差集:

1:  List<int> ListResult = GenPrime(x).Except(GenPrime(y)).ToList();
之后又在另一篇高手的博客中發現了一篇線性的篩法算法,我將之改為了C#代碼:
01:  private static List<int> GenPrime1(int x)02:  {03:      int num_prime = 0;04:      List<int> ints = new List<int>();05:      BitArray isNotPrime = new BitArray(x);06:      for (int i = 2; i < x; i++)07:      {08:          if (!isNotPrime[i])09:          {10:              ints.Add(i);11:              num_prime++;12:          }       13:          for (int j = 0; j < num_prime && i * ints[j] < x; j++)14:          {15:              isNotPrime[i * ints[j]] = true;16:              if (!Convert.ToBoolean(i % ints[j]))                  17:                  break;18:          }19:      }20:      return ints;21:  }
傳送到原帖:一般篩法求素數+快速線性篩法求素數
PS.第一次寫博客,如有不足的地方請告訴我,我一定改!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 梨树县| 凌源市| 宣汉县| 休宁县| 石门县| 南安市| 财经| 东阳市| 古田县| 昭觉县| 屏东市| 南涧| 玉溪市| 玛多县| 澄迈县| 凤台县| 禄劝| 漳浦县| 衡南县| 敦化市| 抚顺市| 尼玛县| 平度市| 鹤庆县| 定西市| 巴林右旗| 大英县| 台山市| 成都市| 南城县| 娄烦县| 正宁县| 临清市| 开化县| 哈巴河县| 泉州市| 蕉岭县| 昌宁县| 镇安县| 故城县| 祁连县|