FOR循环重复的问题

时间:2015-04-13 16:36:01

标签: c# if-statement for-loop

任务是找出一个数字是否为素数。我做了一些研究,并提出了以下代码:

    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.");
    }
}

3 个答案:

答案 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");
                        }
                    }

                }
            }
        }
    }
}