【问题标题】:Prime numbers c# [closed]素数 c# [关闭]
【发布时间】:2023-03-07 22:41:01
【问题描述】:

对不起,我必须问一个非常简单的问题。 我的问题是我想生成质数直到最大数。

这是我的代码:

    for (int i = 2; i <= max - 1; i++)
        {
            System.Threading.Thread.Sleep(1000);
            if (Progress != null)
            {
                if (max%i == 0)
                    Console.WriteLine(i);
            }
        }  

我的代码不起作用,我不知道为什么..

你能帮帮我吗?

【问题讨论】:

  • 我希望你不要将max 设置为 Aleph1...你会等一会儿!
  • 查找 埃拉托色尼筛法 算法。这里有几十个例子,互联网上有数百个例子。
  • 听起来像是功课。什么“不起作用”?您是遇到错误,还是没有得到正确的结果?
  • 你的素数测试在各方面都是错误的。
  • 直到最后一个数字才需要完整的迭代;运行到 sqrt(max) 就足够了

标签: c# .net algorithm primes


【解决方案1】:

提示 1:算法优化

您无需一直达到最大数量。你只需要去它的平方根。

用这个例子和我一起思考:如果 100 除以 50,它首先被捕获为除以 2。所以你只需要上升到 10,之后你找到的任何除数都会找到它的对应物之前。

但这只是您最佳地确定特定数字是否为素数的方法。

提示 2:IsNumberPrime() 方法

首先,您必须有一种方法来确定特定数字是否为质数。请记住此处的提示 1。

提示 3:这次做对了

在您遵循提示 1 和 2 之后,现在您可以循环并确定低于最大素数的最高素数。

结论

抱歉,这里没有代码,只是大致的方向。为你做功课对你没有帮助。这个答案会。

【讨论】:

  • 正确的算法应该是优化它的先决条件!
  • 提示2,先让它工作,然后再考虑优化。
  • 这应该是一个很长的答案,还在写。在那之前,我将不得不忍受反对票
【解决方案2】:

虽然您可以检查每个数字的素数,但这是在浪费工作。有很多数字你甚至不必考虑。除 2 以外的偶数,为一。还有更多的技巧,比如关于 6 的倍数(google it)

如果要生成素数,请使用生成素数的算法。看起来很明显,对吧?但是测试素数的算法不在该类别中。 Eratosthenes 的筛子很好,Atkin 的筛子更好。

如果您无论如何都要检查数字的素数(但说真的,不要),除非您的数字总是很小(例如,小于 10k),否则试除法是最糟糕的理智算法。使用具有已知上限的确定性版本的 Miller Rabin 测试(不是完整版本,因为您确实知道上限,否则您将生成所有 PositiveInfinity 素数)。

【讨论】:

    【解决方案3】:

    我会很傻,给你一些我前段时间为信息学课写的代码。一切都是 ulong,因为它最初被设计为对一些 waaaaaaayy 太高的数进行质数检查。

    ulong min = 0;
    ulong max = 100000;
    ulong i = 0;
    ulong sqrt = 0;
    ulong j = 0;
    
    bool prime = true;
    for (i = min; i <= max; i += 2)
    {
      prime = true;
      sqrt = Math.Sqrt(i) + 1;
      if (i % 2 == 0) prime = false;
      else for (j = 3; j < sqrt; j += 2)
      {
        if (i % j == 0)
        {
          prime = false;
          break;
        }
      }
      if(prime)
      {
        Console.WriteLine(i);
      }
    }
    

    它略有编辑,所以我不完全确定这是否会按预期工作,但自己编辑不会太难。

    【讨论】:

    • ulongs上的试用分工..准备等一下:)
    【解决方案4】:

    判断一个数是否为素数的方法:

    bool IsPrime(int number)
    {
        for (int i = 2; i < sqrt(number); i++)
        {
             if (number%i == 0) return false;
        }
        return true;
    }
    

    对所有不超过最大值的整数调用此方法:

    for (int crt = 1; crt <= max; crt++)
    {
        if (IsPrime(crt))
        {
             Console.WriteLine(crt);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-20
      • 2018-07-01
      相关资源
      最近更新 更多