【问题标题】:Problem with prime numbers not printed correctly [duplicate]素数未正确打印的问题[重复]
【发布时间】:2021-04-30 19:42:22
【问题描述】:

我的代码有问题,我不知道如何解决。基本上,这个程序根据用户输入打印素数,最后打印它们的总和。直到达到一定数量为止,这都可以正常工作,例如:如果我输入 10,它会显示十个正确的素数,但如果我输入 100,它还会打印一个非素数,在这种情况下为 533。我不知道我在哪里错了。

感谢您的支持。

编辑:我自己解决了。基本上for循环内的第一个“If”有一个错误,我只是添加了“c = n - 1;”在 n++ 之后。现在它完美地工作了。

Console.Write("How many prime numbers?: ");
int l = Convert.ToInt32(Console.ReadLine());
int n = 2;
int sum = 0;
sum += n;
Console.WriteLine(n);
n++;
int i = 1;
l++;
while (i < l)
{
    for (int c = n - 1; c > 1; c--)
    {
        if (n % c == 0)
        {
            n++;
        }
        else if (n % c != 0 && c == 2)
        {
            sum += n;
            Console.WriteLine(n);
            n++;
            i++;
        }
    }
}
Console.WriteLine("Sum: " + sum);

【问题讨论】:

  • 代码看起来不对。通常你会检查每个数字的所有合理除数。相反,显示的代码试图通过在检查一半除数后移动到下一个数字来变得超级聪明......通过使用单字母标识符和向后计数循环,代码已经变得非常hacky和难以阅读......所以真的有不需要那种奇怪的转移到下一个数字。重复显示以更易读的方式编写的相同代码(以及添加正确的优化以减少检查次数)。如果这些信息还不够,edit 问题的详细信息不清楚。
  • 我自己解决了这个问题,添加了一个简单的“c = n + 1;”在第一个“If”中的 n++ 之后,现在它可以完美运行。我真诚地发现我的代码易于理解(是的,也许下次我会更改变量的名称啊哈哈)。无论如何,我的程序是这样工作的:它从数字 2 开始,然后有两个循环,第一个是带有“i

标签: c# primes


【解决方案1】:

让我们从提取方法开始:

public static bool IsPrime(int value) {
  if (value <= 1)
    return false;
  if (value % 2 == 0)
    retutn value == 2;

  int n = (int) (Math.Sqrt(value) + 0.5);

  for (int d = 3; d <= n; d += 2)
    if (value % d == 0)
      return false;

  return true;
}

实现此方法后,您可以轻松计算第一个 N 素数的总和:

  int N = 100;
  long s = 0;

  for (int p = 1; N > 0; ++p) {
    if (IsPrime(p)) {
      s += p;
      N -= 1;
    }
  }

  Console.Write(s);
  

另一种(稍微复杂一点)的可能性是素数枚举

  public static IEnumerable<long> Primes() {
    yield return 2;

    List<int> knownPrimes = new List<int>();

    for (int p = 3; ; p += 2) {
      int n = (int) (Math.Sqrt(p) = 0.5);

      bool isPrime = true;

      foreach (int d in knownPrimes) {
        if (d > n)
          break;
        if (p % n == 0) {
          isPrime = false;

          break; 
        } 
      } 

      if (isPrime) {
        knownPrimes.Add(p);

        yield return p; 
      }
    }
  }

然后你可以在Linq的帮助下查询枚举:

  using System.Linq;

  ...

  long s = Primes()
    .Take(N)
    .Sum();  

【讨论】:

  • 感谢您的回复,反正我自己解决了。基本上for循环内的第一个“If”有一个错误,我只是添加了“c = n - 1;”在 n++ 之后。现在它完美地工作了。
猜你喜欢
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多