以下是问题,
找出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;
}
}
}
}
答案 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);
}