求质数几种算法

求某个范围内质数的算法

一、直接应用质数原理:

质数原理:只能被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)

posted @ 2013-09-01 10:56  Serviceboy  阅读(896)  评论(0编辑  收藏  举报