国产探花免费观看_亚洲丰满少妇自慰呻吟_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.第一次寫博客,如有不足的地方請告訴我,我一定改!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新巴尔虎左旗| 丰城市| 浦北县| 新干县| 长兴县| 毕节市| 龙南县| 韶山市| 噶尔县| 广西| 清苑县| 丹江口市| 五指山市| 罗甸县| 灵山县| 任丘市| 黄平县| 赫章县| 穆棱市| 叶城县| 望江县| 西昌市| 镇沅| 长泰县| 蓝山县| 安西县| 淮北市| 炎陵县| 尼勒克县| 泰州市| 乾安县| 阿荣旗| 和田市| 昌吉市| 营山县| 抚远县| 湖南省| 壤塘县| 甘泉县| 曲靖市| 攀枝花市|