【问题标题】:Checking to see if the number the user entered is a prime number [duplicate]检查用户输入的数字是否是质数[重复]
【发布时间】:2013-05-31 14:11:39
【问题描述】:

这个特定的问题不涉及循环,我看到的大多数答案都涉及循环。这是我正在阅读的一本书的挑战。不,我不是学生(38 岁)我实际上正在转换职业,所以我决定开始学习如何编程。我正在阅读的书名为“C#/Joes 2 Pros 简介”。

这是我到目前为止的代码。我知道很可能有更好的方法来使用我可能没有很好掌握的东西来做到这一点。例如,我知道什么是“布尔”,但还没有在我的任何编码中使用它。因此,很难实施。

    int myChoice;
    Console.Write("Please enter a number: ");
    myChoice = int.Parse(Console.ReadLine());

    if (myChoice >= 1 && myChoice % myChoice == 0)
    {
        Console.WriteLine("That's correct, {0} is a prime number.", myChoice);
    }
    else
    {
        Console.WriteLine("That is not a prime number.");
    }

    Console.ReadLine();

好的,你可以看到程序要求用户输入一个数字。由 if 语句确定,如果该数大于或等于 1 并且该数可被自身整除且没有余数,则该语句为真。

我知道有一种更好的方法可以确定输入的数字是否为质数,但我就是不知道它是什么。该程序执行我期望它执行的操作,除了确定数字是否为素数。

这里只是一点背景。你在屏幕上看到的只是我对 C# 的了解程度。除了你看到的,我可能迷路了。

有什么建议吗?

【问题讨论】:

  • 仅供参考,每个数(零除外)除以自身,没有余数。素数的定义是一个数是否只能被 1 和它自己整除,这意味着没有其他个数能整除它。
  • 您的程序将任何数字打印为质数。在谷歌上搜索如何检查数字是否为质数。我建议您使用伪代码或其他语言 C 来完成算法并在 C# 中实现。
  • @BrianRogers 两个字。 Wilson's Theorem.
  • @Aron 对丹尼尔反对的正确答案是:“这是一个库函数,我在乎!” :) :)

标签: c# primes


【解决方案1】:

测试素数还有另一个非常具有挑战性的要求,它不能除以任何其他数字。例如 4 大于 0 且 4 % 4 = 0。但 4 不是素数,它等于 2x2。

测试素数相当困难。大多数入门编程书籍都希望您尝试使用Sieve of Eratosthenes,这是一种确定数字是否为素数的旧方法。 wiki 页面为此提出了一种算法。基本上你在一个数组中生成从 1 到 100 的数字,并删除那些不是素数的,留下从 1 到 100 的所有素数。

【讨论】:

  • 一本初学者的书会要求初学者编写一个程序来检查用户是否输入了质数,这有点有趣。似乎是编辑或作者的巨大疏忽。
  • 公平地说,复杂性不在于语言,而在于所涉及的算法复杂性。如果这是一本可以让你从 C++ 切换到 C# 的书,那么是的,这是合适的。
  • 真的,所有你需要检查的素数是2个for循环和一个布尔值
  • @ChrisSmith 数论确实不是一个简单的主题。用于测试“素数”的最有效算法运行几种不同的算法。最快的算法只能测试“可能的素数”。最快的确定性素数检验要求黎曼假设为真。通常,商业算法通过首先测试可能的素数然后是确定性素数来测试素数。如果我刚才描述的任何事情对你来说毫无意义......这是一个愚蠢的错误。
【解决方案2】:

如果你的数字 n 很小,可以简单地测试所有小于sqrt(n) 的数字作为除数;如果没有一个能除n,那么n是素数:

function isPrime(n)
    d := 2
    while d * d <= n
        if n % d == 0
            return Composite
        d := d + 1
    return Prime

对于较大的数字,一个合理的素数检验是米勒-拉宾检验;它可以被愚弄(错误地宣称一个合数是素数),但可能性很小。从强伪素测试开始:

function isStrongPseudoprime(n, a)
    d := n - 1; s := 0
    while d is even
        d := d / 2; s := s + 1
    t := powerMod(a, d, n)
    if t == 1 return ProbablyPrime
    while s > 0
        if t == n - 1
            return ProbablyPrime
        t := (t * t) % n
        s := s - 1
    return DefinitelyComposite

函数返回的每个a大概是n的素数的见证;对它们进行足够的测试,您就会对 n 实际上是素数有信心:

function isPrime(n)
    for i from 1 to k
        a := randint(2 .. n-1)
        if isStrongPseudoprime(n, a) == DefinitelyComposite
            return DefinitelyComposite
    return ProbablyPrime

变量k是你想要执行的试验次数; 10 到 25 之间的某个值通常是一个合理的值。 powerMod(b,e,m) 函数返回 b ^ e (mod m)。如果您的语言不提供该功能,您可以像这样有效地计算它:

function powerMod(b, e, m)
    x := 1
    while e > 0
        if e % 2 == 1
            x := (b * x) % m
        b := (b * b) % m
        e := floor(e / 2)
    return x

如果你对这个测试背后的数学感兴趣,我在我的博客上谦虚地推荐这篇文章 Programming with Prime Numbers

【讨论】:

    猜你喜欢
    • 2020-04-30
    • 2018-05-11
    • 2015-06-20
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 2021-07-08
    相关资源
    最近更新 更多