检查用户输入的数字是否为素数

时间:2013-06-05 02:05:46

标签: c# primes

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

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

    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#的了解程度。除了你所看到的,我可能会迷失方向。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

如果你的数字 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

该函数返回ProbablyPrime的每个 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