试图找到第10001个素数,C#

时间:2018-07-21 15:37:58

标签: c# primes

作为Euler项目挑战的一部分,我试图“查找第10001个素数”,我不知道为什么我的代码不起作用。当我测试isPrime()函数时,它成功地找到了一个数字是否为质数,但是我的程序返回10200作为第10001个质数。为什么会这样?

该程序在Visual Studio中的C#中

using System;
using System.Collections.Generic;

namespace Challenge_7
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Solution to Project Euler");
            Console.WriteLine("Challenge 7 - Find the 10001st prime");

            Console.WriteLine("\nProject Start:");

            List<int> primes = new List<int>();

            int number = 1;
            while (primes.Count != 10001)
            {
                if (isPrime(number))
                {
                    primes.Add(number);
                    Console.WriteLine(number);
                }

                number++;
            }

            Console.WriteLine("The 10001st prime is: {0}", primes[10000]);

            Console.ReadLine();
        }

        private static bool isPrime(int n)
        {
            bool prime = true;

            for (int i = 1; i <= Math.Ceiling(Math.Sqrt(n)); i++)
            {
                for (int j = 1; j <= Math.Ceiling(Math.Sqrt(n)); j++)
                {
                    if (i * j == n)
                    {
                        prime = false;
                    }
                }
            }
            return prime;
        }
    }
}

3 个答案:

答案 0 :(得分:4)

这里有个提示:

想象一个数字,它是3个质数的乘积。 比方说3、5和7(或)105;

sqrt(105)== 10.2,所以上限为11

不小于11的两个数字乘以105。 因此,您的算法会错误地返回true!

再试一次! :-D

答案 1 :(得分:1)

问题出在循环中。 Math.Ceiling(Math.Sqrt(10200))101,您需要检查102 * 100 = 10200,但是循环永远不会到达102并返回10200作为质数!

您可以将以下代码用于isPrime。它存在于this link中,我为您更改为C#:

private static bool isPrime(int n)
{
    if (n <= 1)
        return false;
    else if (n <= 3)
        return true;
    else if (n % 2 == 0 || n % 3 == 0)
        return false;
    int i = 5;
    while (i * i <= n)
    {
        if (n % i == 0 || n % (i + 2) == 0)
            return false;
        i += 6;
    }
    return true;
}

答案 2 :(得分:-1)

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

namespace nthPrimeNumber
{
    class Program
    {
        static void Main(string[] args)
        {
            ulong starting_number = 1;
            ulong last_number = 200000; //only this value needs adjustment
            ulong nth_primenumber = 0;
            ulong a;
            ulong b;
            ulong c;
            for (a = starting_number; a <= last_number; a++)
            {
                b = Convert.ToUInt64(Math.Ceiling(Math.Sqrt(a)));
                for (c = 2; c <= b; c++)
                {
                    if (a == 1 || (a % c == 0 && c != b))
                    {
                        break;
                    }
                    else
                    {
                        if (c == b)
                        {
                            nth_primenumber = nth_primenumber + 1;
                            break;
                        }
                    }
                }
                if (nth_primenumber == 10001)
                {
                    break;
                }
            }
            Console.WriteLine(nth_primenumber + "st" + "prime number is " + a);
            Console.ReadKey();
        }
    }
}

上面的程序生成1到200000之间的质数。程序对生成的质数进行计数,并检查生成的质数是否已经是10001。程序将打印第10001个质数。如果程序在控制台中没有显示10001st(或显示在10001以下),那是因为last_number的值很小-请尝试调整last_number的值(增大它)。在此程序中,我已经调整了last_number的值,并将打印第10001个素数。