求质数几种算法
求某个范围内质数的算法
一、直接应用质数原理:
质数原理:只能被2~其本身-1的任意一个数字,如果都不可以被除尽,那么肯定是质数。
源码:
static bool IsPrime(int num) { for (int i = 2; i <= num-1;i++) { if (num % i == 0) return false; } return true; }
时间复杂度:O(n)
改进版一:
把上方算法num-1改成Math.Sqrt(num),虽然时间复杂度还是O(n),但是如果数字越大,效果越明显。
改进版二:
一个合数一定可以分解成若干的质数的乘积(2除外),那么我们可以预存质数在一个列表中,然后直接从已有的质数中进行除法判断,代码如下:
namespace Csharp { public class MainTest { public static List<int> primes = new List<int>(); static bool IsPrime(int num) { for (int i = 0; i < primes.Count; i++) { if (num % primes[i] == 0) return false; } return true; } static void Main(string[] args) { int num = 0; //Count how many prime numbers are generated int counter = 0; Console.WriteLine("Please input a number:"); num = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Results are:"); for (int i = 2; i < int.MaxValue; i++) { if (IsPrime(i)) { primes.Add(i); Console.WriteLine(i); counter++; if (counter == num) { break; } } } } } }
时间复杂度:O(n)(仅考虑质数判断部分),空间复杂度S(n)