任务是找出一个数字是否为素数。我做了一些研究,并提出了以下代码:
using System;
class PrimeOrNot
{
static void Main()
{
Console.WriteLine("Write a natural number:");
int number = int.Parse(Console.ReadLine());
if (number == 1)
{
Console.WriteLine("Not prime"); //is 1 prime?
}
if (number == 2)
{
Console.WriteLine("Is Prime");
}
if (number % 2 == 0)
{
Console.WriteLine("Not prime");
}
else
{
for (int i = 3; i < number; i += 2)
{
if (number % i == 0)
{
Console.WriteLine("Not Prime");
}
else
{
Console.WriteLine("Is Prime");
}
}
}
}
}
问题在于,如果数字将测试一直传递给FOR函数,那么它就变得很时髦了。它打印了很多“Is Prime”,如果它是素数,如果不是,它会打印很多“Is Prime”和一些“Not Prime。我一步一步地调试它,看看问题源于哪里,但我无法找到解决方案。
那我该怎么处理呢?
编辑:
所以我在开始时就像弗兰克建议的那样缩小了IF,然后使用了BradleyDotNET的代码和瞧。今天我学会了打破循环。我最终得到的代码是:
using System;
class PrimeOrNot
{
static void Main()
{
Console.WriteLine("Write a natural number:");
int number = int.Parse(Console.ReadLine());
bool isPrime = true;
if (number > 1 && number % 2 != 0)
{
for (int i = 3; isPrime && i < number; i += 2)
{
if (number % i == 0)
{
isPrime = false;
break;
}
}
}
else
{
isPrime = false;
}
if (isPrime)
Console.WriteLine("Number is prime!");
else
Console.WriteLine("Number is not prime.");
}
}
答案 0 :(得分:3)
首先,该代码并未真正检查数字是否为素数。
当你进入for循环时,你有这样的条件:
if (number % i == 0)
检查3和你的号码之间的每个数字,增加2。它使用模数(返回数字的余数除以i)。所以基本上,对于该组中均匀分配输入的每个数字,您将获得“Not Prime”输出,并为每个其他数字输出“Prime”输出。
如果只想要一个输出,请在循环期间设置一个布尔变量,然后在循环外部检查它以进行输出。这是一个示例:
bool isPrime = true;
//Stopping the loop once we know its not prime is better
//Note that it won't even evaluate i < number if isPrime fails
for (int i = 3; isPrime && i < number; i += 2)
{
if (number % i == 0)
{
isPrime = false;
//Adding this line makes us more efficient
//Some people don't like breaking flow like this though
break; //We're done
}
}
if (isPrime)
Console.WriteLine("Number is prime!");
else
Console.WriteLine("Number is not prime.");
请注意,该代码包含两种提高效率的方法。实际上不要在实际代码中使用它们,因为它们具有相同的效果:)
正如Jon Skeet在评论中提到的那样,你可以将第一个块重构为一个方法,这是提高代码可读性和重用性的一种非常好的方法。
答案 1 :(得分:0)
首先,数字1被排除在素数之外。我不知道为什么,因为从技术上来说,它只能被1和它自己分开。咩。 1不是素数。
数字2绝对是一个素数,因为数字2只能被1除以它自己。
所以我可能会改变你的前三个{}如果{n> 1&amp;&amp; n%2!= 0)。这应该会让你通过3号(我认为)。
然后让你的for {}循环进入else {}。不幸的是,我没有测试你的int号码。它会测试您输入的数字和3之间的所有数字。
只是另一个if语句可以解决问题。无需遍历测试中的所有数字。我认为我先写的if语句可能会这样做吗?嗯...
编辑:尊敬地,我无法添加评论,OP要求测试他的number
是否为素数,而不是3和他的输入之间的所有数字。< / EM> 强>
答案 2 :(得分:0)
您的问题可能是您的代码正在为从3到您的号码的循环的每次迭代提供建议。相反,您可能希望它只对每个奇数值进行评估,然后只要它发现规则的异常就会中断,如下所示:
using System;
namespace IsItPrime
{
class Program
{
static void Main(string[] args)
{
bool exit = false;
while (!exit) {
Console.WriteLine("Write a natural number:");
string answer = Console.ReadLine();
if (answer.Equals("x")) {
exit = true;
}
else
{
int number = int.Parse(answer);
if (number == 1)
{
Console.WriteLine("Not prime"); //is 1 prime?
}
else if (number == 2)
{
Console.WriteLine("Not Prime");
}
else if (number % 2 == 0)
{
Console.WriteLine("Not prime");
}
else
{
bool isPrime = false;
for (int i = 3; i < number; i += 2)
{
if (number % i == 0)
{
isPrime = true;
break;
}
}
if (isPrime)
{
Console.WriteLine("Not Prime");
}
else
{
Console.WriteLine("Is Prime");
}
}
}
}
}
}
}