试图找到第10001个素数,c#
作为Euler项目挑战的一部分,我正在尝试“寻找第10001个素数”,我不知道为什么我的代码不起作用。当我测试isPrime()函数时,它成功地找到了一个数字是否为素数,但我的程序返回10200作为10001素数。为什么会这样 这是我的代码:试图找到第10001个素数,c#,c#,primes,C#,Primes,作为Euler项目挑战的一部分,我正在尝试“寻找第10001个素数”,我不知道为什么我的代码不起作用。当我测试isPrime()函数时,它成功地找到了一个数字是否为素数,但我的程序返回10200作为10001素数。为什么会这样 这是我的代码: 使用系统; 使用System.Collections.Generic; 名称空间挑战7 { 班级计划 { 静态void Main(字符串[]参数) { Console.WriteLine(“Euler项目解决方案”); Console.WriteLine(
使用系统;
使用System.Collections.Generic;
名称空间挑战7
{
班级计划
{
静态void Main(字符串[]参数)
{
Console.WriteLine(“Euler项目解决方案”);
Console.WriteLine(“挑战7-找到第10001个素数”);
Console.WriteLine(“\n项目开始:”);
列表素数=新列表();
整数=1;
while(primes.Count!=10001)
{
如果(iPrime(数字))
{
素数。加(数);
控制台写入线(编号);
}
数字++;
}
WriteLine(“第10001个素数是:{0}”,素数[10000]);
Console.ReadLine();
}
专用静态bool isPrime(int n)
{
布尔素数=真;
对于(inti=1;i,这里有一个提示:
想象一个数字是3个素数的乘积。
假设3、5和7(或)105
sqrt(105)=10.2,因此天花板为11
没有两个小于11的数字乘以105。
所以你的算法会错误地返回true
再试一次!:-D这里有一个提示:
想象一个数字是3个素数的乘积。
假设3、5和7(或)105
sqrt(105)=10.2,因此天花板为11
没有两个小于11的数字乘以105。
所以你的算法会错误地返回true
再试一次!:-D问题出在你的循环中。Math.天花(Math.Sqrt(10200))
是101
,你需要检查102*100=10200
,但是你的循环永远不会到达102
并返回10200
作为素数
您可以将下面的代码用于isPrime
。它存在于中,我为您更改为C:
私有静态bool isPrime(int n)
{
如果(n问题出在你的循环中。Math.天花(Math.Sqrt(10200))
是101
,你需要检查102*100=10200
,但是你的循环永远不会到达102
并返回10200
作为素数
您可以将下面的代码用于isPrime
。它存在于中,我为您更改为C:
私有静态bool isPrime(int n)
{
如果(n使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
名称空间素数
{
班级计划
{
静态void Main(字符串[]参数)
{
ulong启动编号=1;
ulong last_number=200000;//仅此值需要调整
ulong n_素数=0;
乌龙阿;
乌隆b;
乌隆c;
对于(a=起始编号;a使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
名称空间素数
{
班级计划
{
静态void Main(字符串[]参数)
{
ulong启动编号=1;
ulong last_number=200000;//仅此值需要调整
ulong n_素数=0;
乌龙阿;
乌隆b;
乌隆c;
对于(a=起始值;a那么如果你调用isPrime(10200)你得到了正确的答案吗?正如Peter在回答中提到的,你的方法是不正确的。有很多方法可以检查SOF上的数字是否为素数。我建议你学习并尝试以下方法:使用Math.Sqrt()
对于检查i*j==n
,只能应用于一个数字,但不能同时应用于两个值。Sqrt(10200)是100.995
和10200=2*5100
,但是循环的永远不会到达5100
检查2*5100
!所以如果调用isPrime(10200)你明白了吗?正如Peter在回答中提到的,你的方法不正确。有很多方法可以检查SOF上的数字是否为素数。我建议你学习并尝试以下方法:使用Math.Sqrt()的方法
对于检查i*j==n
,只能应用于一个数字,但不能同时应用于两个值。Sqrt(10200)是100.995
和10200=2*5100
但是你的for loop
永远不会到达5100
来检查2*5100
!嗨,约翰,在你的答案中加入一个解释是很有帮助的,而不仅仅是代码。这样人们就更容易从答案中学习并理解为什么代码是他们问题的答案。嗨John,在答案中加入解释是很有帮助的,而不仅仅是代码。这样,人们就更容易从答案中学习并理解为什么代码是他们问题的答案。
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;
}
}
}
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;
}
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();
}
}
}