【问题标题】:Prime factor within a range of numbers一个数字范围内的素数
【发布时间】:2020-02-20 19:56:20
【问题描述】:

我尝试在 Visual Studio 中运行此代码。它不输出任何东西并运行无限循环。

    private void calculateButton_Click(object sender, EventArgs e)
        {
            int startNumber, endNumber, counter, num;
            startNumber = Convert.ToInt32(minValue.Text);
            endNumber = Convert.ToInt32(maxValue.Text);
            int startNumCounter = startNumber;
            for (num = startNumCounter; num <= endNumber; num++)
            {
                counter = 0;

                int numCurrent = num;
                for (int i = 2; i <= num; i++)
                {
                    if (numCurrent % i == 0)
                    {
                        output.Text += " " + i + " ";
                        num = num / i;
                        counter++;


                    }


                    if (counter != 0 && num >= 2)
                        output.Text = "Factors: " + num;
                }

            }

        }
    }
}

预期输出:Min 7, Max: 10 ...... 8: 2 * 2 * 2. 9: 3 * 3. 10: 2 * 5. 所以它会在 min 和 max 范围内找到数字的素因数.如果范围内的数字是素数,则不计入素数。

【问题讨论】:

  • num = num / i; 减少你的循环变量;它不会增加它,这是结束您的外部 for 循环所需要的。
  • 我能做些什么来解决这个问题?
  • 要么重写你的循环,使其收敛到零(或任何你的下限),或者改变你改变num的方式,使它向上收敛到你当前的循环限制。
  • 我想补充一下——一般来说,修改for 循环变量是非常不寻常的。如果您发现自己需要做类似的事情,将其重写为while 通常会更清晰。

标签: c#


【解决方案1】:

这是我想出的代码:

private void calculateButton_Click(object sender, EventArgs e)
        {
            int startNumber, endNumber, counter, num;
            startNumber = Convert.ToInt32(minValue.Text);
            endNumber = Convert.ToInt32(maxValue.Text);
            int startNumCounter = startNumber;
            for (num = startNumCounter; num <= endNumber; num++)
            {
                output.Text += $"Factors {num}:";
                counter = 0;
                int numCurrent = num;

                for (int i = 2; i <= numCurrent; i++)
                {
                    bool continueToNexti = false;
                    while (!continueToNexti)
                    {
                        if (numCurrent % i == 0)
                        {
                            output.Text += $" {i} ";
                            numCurrent = numCurrent / i;
                            counter++;
                        }
                        else
                        {
                            continueToNexti = true;
                        }
                    }

                }
                output.Text += Environment.NewLine;
            }
        }

对此的一些说明: 你的代码没有结束的原因是这一行

num = num / i;

应该是的

numCurrent = numCurrent / i;

此外,我想出了一个额外的循环,即 While 循环,以解决一个数字可以被同一个因子多次整除的事实。

为了加快速度,我改变了

for (int i = 2; i <= num; i++)

for (int i = 2; i <= numCurrent; i++)

【讨论】:

  • 如果我不想打印范围内的素数,我会在与 bool Nexti 相同的区域添加另一个 bool 语句吗?例如,最小值:7 和最大值:10。现在 7 是素数,除了它自己和 1 之外没有其他因子,所以我不会打印它。所以我会设置 bool isPime = true 然后说 if bool isPrime == false, out.textbox = $"Factors {num}:";
猜你喜欢
  • 2018-05-23
  • 2011-05-12
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
相关资源
最近更新 更多