【问题标题】:Find prime number in C# [closed]在 C# 中查找素数 [关闭]
【发布时间】:2013-11-16 19:54:42
【问题描述】:

好的,我想从控制台输入一个整数并检查该数字是否为素数。 我挖了一个代码,并对其进行了转换以满足我的需要,但它计算不正确。

using System;
    class PrimeNumber
    {
    static void Main()
    {
        Console.Write("Type a number: ");
        string line = Console.ReadLine(); // Read string from console
        int value;
        if (int.TryParse(line, out value)) // Try to parse the string as an integer
        {
            int x = 0;
            if (value == 1) Console.WriteLine("not prime");
            if (value == 2) Console.WriteLine("prime");
            for (int i = 3; i < value*value; i+=2)
            {
                if (value % 2 == 0) x++; break;
                if (value % i == 0) x++; break;
            }
            Console.WriteLine(x);
            if (x == 0) Console.WriteLine(value + " is prime");
            else Console.WriteLine(value + " is not prime");
        }
        else
        {
            Console.WriteLine("Invalid input.");
        }
    }
}

【问题讨论】:

  • (..) 但它计算不正确,因为 ...
  • 你尝试过的价值观是什么?
  • @whoever 投票结束:不要这么快结束问题......我发现了问题,但我无法回答,因为问题已结束。这简直是​​愚蠢的......
  • 顺便说一句,您的if ( value % i == 0 ) x++; 无法访问..
  • 对于那些认为问题已过早关闭的人,请注意,OP 的问题基本上是“我从某个地方挖出这段代码并稍作更改,但 它没有不行。你能帮我修一下吗?”这不是问题,甚至不是问题陈述。

标签: c# primes


【解决方案1】:

问题出在这里:

if (value % 2 == 0) x++; break;
if (value % i == 0) x++; break;

break 语句不是if 的一部分,只有x++ 是...所以break始终 执行的,无论条件是否为真。

您应该将语句括在大括号中:

if (value % 2 == 0) { x++; break; }
if (value % i == 0) { x++; break; }

另外两个问题:

  • 您应该将if (value % 2 == 0) 放在循环之外,因为在每次迭代时再次检查它是没有用的。
  • 您应该在sqrt(value)(包括)而不是value² 处停止迭代。如果你转到value²,在某些时候i 将等于value,所以value % i 将为0,并且该数字不会被视为素数。

【讨论】:

  • 你看到别的东西了吗,因为 9 似乎是素数,尽管 9%3 是 0
  • @user3000071,您需要在sqrt(value) (包括而非排他)处停止循环。否则它会在到达 3 之前停止,并且不会将 3 检测为除数
【解决方案2】:

这是找出一个数是否为素数的有效方法。

static bool IsPrime(int n)
{
    for(int i = 2; i <= Math.Sqrt(n); i++)
    {
        if(n % i == 0)
            return false;
    }
    return true;
}

【讨论】:

    【解决方案3】:

    您还可以使用eratosthenes sieve,它可以有效地生成素数: 我的实现:

    static int[] GenerateEratosthen()
        {
            bool[] e = new bool[200000];
            for (int i = 2; i < 200000; i++)
            {
                for (int j = 2; j * i < 200000; j++)
                {
                    e[j * i] = true;
                }
            }
            int[] p = new int[20000];
            int k = 0;
            for (int i = 1; i < 200000; i++)
            {
                if (!e[i])
                    p[k++] = i;
            }
            return p;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-03
      • 1970-01-01
      • 2016-07-20
      • 2015-02-17
      • 1970-01-01
      • 2023-03-07
      • 2021-12-19
      • 1970-01-01
      相关资源
      最近更新 更多