【问题标题】:C# - Checking for prime numbers in a limit [closed]C# - 检查限制中的素数 [关闭]
【发布时间】:2016-07-20 16:30:36
【问题描述】:

我想编写一个代码,显示素数一个数字到另一个数字的列表。例如从 1 到 8,它将是 2、3、5、7。我从 user1954418 的“检查数字是否为质数”中得到一个代码,因为我不知道从哪里开始,所以我选择 NO 归功于代码。

int num1;
Console.WriteLine("Prime Number:");
num1 = Convert.ToInt32(Console.ReadLine());
if (num1 == 0 || num1 == 1)
{
    Console.WriteLine(num1 + " is not prime number");
    Console.ReadLine();
}
else
{
    for (int a = 2; a <= num1 / 10; a++)
    {
        if (num1 % a == 0)
        {
            Console.WriteLine(num1 + " is not prime number");
            return;
        }
    }
    Console.WriteLine(num1 + " is a prime number");
    Console.ReadLine();
}

【问题讨论】:

  • 循环查找
  • 这不是在另一个 for 循环中创建一个 for 循环吗?
  • 查看下面的答案;放置断点并执行F11 看看发生了什么,这有助于您理解
  • 你试过什么?到底出了什么问题?你有任何错误吗?这些错误是什么?你试图做什么来修复这些错误?当你这样做的时候发生了什么?请记住在提出问题时包括这些内容。请遵循本指南以确保您的问题是高质量的:stackoverflow.com/help/how-to-ask
  • 您发布的代码似乎大部分来自Check if number is prime number。你应该在你的问题中正确地指出这一点

标签: c# primes


【解决方案1】:

这是我在我的一个项目中编写/复制的一些代码。它可能会更顺畅一些,但它可以完成工作。

    // Found this awesome code at http://csharphelper.com/blog/2014/08/use-the-sieve-of-eratosthenes-to-find-prime-numbers-in-c/
    // This creates a List of Booleans where you can check if a value x is prime by simply doing if(is_prime[x]);
    public static bool[] MakeSieve(int max)
    {
        var sqrt = Math.Sqrt((double)max);
        // Make an array indicating whether numbers are prime.
        var isPrime = new bool[max + 1];
        for (var i = 2; i <= max; i++) isPrime[i] = true;

        // Cross out multiples.
        for (var i = 2; i <= sqrt; i++)
        {
            // See if i is prime.
            if (!isPrime[i]) continue;
            // Knock out multiples of i.
            for (var j = i * 2; j <= max; j += i)
                isPrime[j] = false;
        }
        return isPrime;
    }

    public static List<int> GetListOfPrimes(int max)
    {
        var isPrime = MakeSieve(max);
        return new List<int>(Enumerable.Range(1, max).Where(x => isPrime[x]));
        //var returnList = new List<int>();
        //for (int i = 0; i <= max; i++) if (isPrime[i]) returnList.Add(i);
        //return returnList;
    }

这是一个使用示例:

    static void Main(string[] args)
    {
        var x = GetListOfPrimes(8);

        foreach (var y in x)
        {
            Console.WriteLine(y);
        }

        Console.Read();
    }

【讨论】:

    【解决方案2】:

    让它变得简单;以下代码将为您提供帮助:

    Console.WriteLine("Enter the Limit:");
    int Limit;
    if (!int.TryParse(Console.ReadLine(), out Limit))
       {
          Console.WriteLine("Invalid input");
       }
    Console.WriteLine("List of prime numbers between 0 and {0} are :",Limit);
    for (int i = 2; i < Limit; i++)
       {
          if (checkForPrime(i))
              Console.WriteLine(i);
       }
    Console.ReadKey();
    

    其中checkForPrime()定义如下:

    public static bool checkForPrime(int Number)
        {
            for (int a = 2; a <= Number / 2; a++)
            {
                if (Number % a == 0)
                {
                    return false;
                }
            }
            return true;
        } 
    

    【讨论】:

    • 因此,既然您的正确没有具体限制,我是否可以使用 var errorcount 将用户输入限制为
    • (使用while循环)
    • 你检查了吗?它将提示用户输入限制;那么它会显示“0到极限之间的素数列表”那为什么你需要另一个极限?
    • 因为我希望素数只在101之间,所以如果用户输入200就无效了。
    【解决方案3】:

    这是一个应该可以工作的示例。我刚刚从这里得到的 isPrime 代码Here

    然后在 main 函数中,只有从你的起始编号到结束编号​​的循环,并在每个循环上运行 isPrime 函数。

    代码如下:

    class Program
    {
        static void Main(string[] args)
        {
            int numberStart;
            int numberEnd;
    
            // Take in the start point and the end point
            Console.WriteLine("Starting Number:");
            if(!int.TryParse(Console.ReadLine(), out numberStart)){
                Console.WriteLine("Your input is invalid.");
            }
    
            Console.WriteLine("Ending Number:");
            if (!int.TryParse(Console.ReadLine(), out numberEnd))
            {
                Console.WriteLine("Your input is invalid.");
            }
    
            // Loop from the first number to the last number, and check if each one is prime
            for (int number = numberStart; number < numberEnd; number++)
            {
                Console.WriteLine(number + " is prime?");
                Console.WriteLine(isPrime(number) + "\n");
            }
    
    
    
            Console.ReadLine();
    
        }
    
        // Function for checking if a given number is prime.
        public static bool isPrime(int number)
        {
            int boundary = (int) Math.Floor(Math.Sqrt(number));
    
            if (number == 1) return false;
            if (number == 2) return true;
    
            for (int i = 2; i <= boundary; ++i)
            {
                if (number % i == 0) return false;
            }
    
            return true;
        }
    }
    

    请注意,函数 isPrime() 只检查到根目录,因为用户在链接中提到的进一步检查是不必要的。

    希望对你有帮助:)

    【讨论】:

    • 为什么Convert.ToInt32() 为什么不int.TryParse()
    • 这实际上是我的错,因为我只使用了一些旧代码,现在固定使用 int.TryParse(),这也有助于错误处理。谢谢你的收获。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    相关资源
    最近更新 更多