c# - 质数公式

标签 c# math formula primes

我正在尝试用 C# 编写素数函数,我想知道以下代码是否有效。它“似乎”适用于前 50 个左右的数字。我只是想确保无论数字有多大它都能正常工作:

static bool IsPrime(int number)
{
    if ((number == 2) || (number == 3) || (number == 5) || (number == 7) || (number == 9))
            return true;

    if ((number % 2 != 0) && (number % 3 != 0) && (number % 5 != 0) &&
        (number % 7 != 0) && (number % 9 != 0) && (number % 4 != 0) &&
        (number % 6 != 0))
        return true;

        return false;
 }

最佳答案

不,这是行不通的!例如,尝试 121 = 11 * 11,这显然不是质数。

对于提供给函数的任何数字,它是质数 X1, X2, ..., Xn(其中 n >= 2)与它们都大于或等于 11,您的函数将返回 true。 (而且,如前所述,9 不是质数)。

从维基百科可以看到:

In mathematics, a prime number (or a prime) is a natural number that has exactly two distinct natural number divisors: 1 and itself.

所以一个非常简单和幼稚的检查数字是否为质数的算法可能是:

public bool CalcIsPrime(int number) {

    if (number == 1) return false;
    if (number == 2) return true;

    if (number % 2 == 0) return false; // Even number     

    for (int i = 2; i < number; i++) { // Advance from two to include correct calculation for '4'
       if (number % i == 0) return false;
    }

    return true;

}

要获得更好的算法,请查看此处:Primality Test

如果你想检查你的代码,做一个测试,这里是一个用xunit编写的测试用例.

        [Theory]
        [MemberData(nameof(PrimeNumberTestData))]
        public void CalcIsPrimeTest(int number, bool expected) {
            Assert.Equal(expected, CalcIsPrime(number));
        }

        public static IEnumerable<object[]> PrimeNumberTestData() {
            yield return new object[] { 0, false };
            yield return new object[] { 1, false };
            yield return new object[] { 2, true };
            yield return new object[] { 3, true };
            yield return new object[] { 4, false };
            yield return new object[] { 5, true };
            yield return new object[] { 6, false };
            yield return new object[] { 7, true };
            yield return new object[] { 8, false };
            yield return new object[] { 9, false };
            yield return new object[] { 10, false };
            yield return new object[] { 11, true };
            yield return new object[] { 23, true };
            yield return new object[] { 31, true };
            yield return new object[] { 571, true };
            yield return new object[] { 853, true };
            yield return new object[] { 854, false };
            yield return new object[] { 997, true };
            yield return new object[] { 999, false };
        }

关于c# - 质数公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3285562/

相关文章:

c# - 从 NodeJS 验证 "Owin OAuth Bearer Token"

random - 从字符串列表中返回随机字符串的公式?

r - 使用多列的model.matrix

java - 识别组件频率并计算曲线的积分

c# - 动画 : Sliding & Fading controls on a C# form (winforms)

Excel - 如何获得最后一个由数字和 "N/A"随机混合组成的行中最后10个值的平均值

c# - 在锁定文件中找不到所需的信息。确保你的目标中提到了 .NETCore,Version=v5.0/win10-anycpu

C# - 声明(不实现)接口(interface)实例的原因

c# - 动态对象?以下代码如何工作?

image - 有什么可用的 C 矩阵操作库?