使用平方根查找素数

时间:2014-02-05 22:34:54

标签: c# algorithm

以下是问题,

  

找出200万以下所有素数的总和。

我的代码列出了许多非素数,例如9,15 ......,出了什么问题?

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace p10
{
    // The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. Find the sum of all the primes below two million.
    class Program
    {
        static List<long> list = new List<long>();
        static void Main(string[] args)
        {
            Stopwatch sw = Stopwatch.StartNew();
            list.Add(2);
            list.Add(3);
            long x = list.Last();
            while (x < 2000000)
            {
                x += 2;
                FindPrime(x);
            }
            long y = list.Sum() - list.Last();
            Console.WriteLine(y);
            Console.WriteLine("Time used (float): {0} ms", sw.Elapsed.TotalMilliseconds);
            Console.WriteLine("Time used (rounded): {0} ms", sw.ElapsedMilliseconds);
            Console.ReadKey();
        }

        static void FindPrime(Int64 p)
        {
            Int64 max = (Int64)Math.Ceiling(Math.Sqrt(p));
            foreach (long n in list)
            {
                while (n <= max)
                {
                    if (p / n == 0)
                    {
                        continue;
                    }
                    else
                    {
                        list.Add(p);
                        break;
                    }
                }break;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:7)

当您测试一个数字是否可以被另一个数字整除时,您想知道余数是否为零。改变这个:

if (p / n == 0)

对此:

if (p % n == 0)

但是看起来你的循环仍然存在问题。您可以将其重写为:

static void FindPrime(long p)
{
    long max = (long)Math.Ceiling(Math.Sqrt(p));
    foreach (long n in list)
    {
        if (n > max) 
        {
            break;
        }
        else if (p % n == 0)
        {
            return;
        }
    }

    list.Add(p);
}