【问题标题】:How do I create an algorithm that calculates the factors of an integer in C#?如何在 C# 中创建一个计算整数因子的算法?
【发布时间】:2009-11-17 02:40:23
【问题描述】:

我需要提出的算法是计算用户输入数字的所有因数,例如用户输入“50”,程序将显示 50 的所有因数,即:1、2 , 5, 10, 25, 50。

该程序需要适用于所有正整数值。

有人愿意教我怎么做吗?这不是家庭作业,它只是学习材料,我已经尝试解决这个问题超过 2 小时。我应该使用数组吗?

【问题讨论】:

  • 你知道projecteuler.net 吗?
  • 这个previous question会给你一些线索
  • 哈,不,我没有,但现在我做到了,谢谢你的链接,那些看起来很酷很有趣。
  • python中的相关问题

标签: c# .net


【解决方案1】:

这里有一条线索:如果 Y / X 没有余数,则数字 X 是 Y 的因数。另一条线索:大多数语言中都有常用的数学运算符来判断一个数除以另一个数是否有余数。

【讨论】:

  • 你的意思是如果它没有余数?
  • 我认为你的意思是Y / X 的余数为零。
  • Darnit,Tesserex,你在两次编辑之间的 20 秒内抓住了我。是的,这是一个愚蠢的错误。
  • 好的,c#中有没有办法检查某些东西是否均匀分布?我想我可以做类似 if (x % i == 0) 那么它的一个因素?我相信我越来越暖和了。
【解决方案2】:

首先,尝试一种天真的/蛮力方法

例如,您可以遍历从 1 到用户提供的 [希望相对较小的] 数字之间的所有数字,并检查它是否均匀地除此数字。

顺便说一句,您可以使用 模运算符 来断言给定整数完全可以被另一个整数整除(或者更准确地说,模运算的结果应该是特定值)。

一旦你完成了这项工作,你就可以想到可以消除迭代中的一些数字的方法。这种方法在解决问题时并不罕见:
1)以天真的方式解决问题,
2) 寻找削减/过滤/修剪的方法,并以其他方式改进幼稚的方法。
如果不出意外,朴素方法提供了一个很好的基线,而且由于它也更简单,它也可以用于验证更复杂方法的输出。

一旦你对这个解决方案玩够了,你就可以尝试一种独特的方法。这个想法是将数字分解为其主要因素。在示例中,50 将给出 (1, 2, 5, 5, 50),然后您需要枚举这些素因数的所有组合(不包括琐碎的 1 和 50)。素数分解通常应该是直截了当的(想想你在早期的数学课中学习它的方式),但所有可能组合的枚举可能会让你停顿一下(然而,这是不断出现的算法类型时尚或其他 CS 应用程序)。

【讨论】:

  • 啊,谢谢!我没想过先暴力破解它,但我会试试看。
  • 嘿,感谢您的详细解释,它帮助我从逻辑上思考。
【解决方案3】:

我可能会选择更简单的 .NET 版本:

int factor = 3447; // Input
List<int> results = new List<int>();
for (int i=1; i<factor; i++) {
    for (int j=1; j<factor; j++) {
        if ( i % j == 0 ) {
            results.Add(i);
            break;
        }
    }
}

这应该会产生预期的结果。它通过递增地遍历从 1 到 X 的所有数字(从数字到因子)来工作。内部循环遍历同一组数字以查看模数是否为零(无余数)。一旦找到一个,我们就会继续前进,否则我们会得到重复。

另请注意,这是一种最坏情况(蛮力)算法。

【讨论】:

  • 这很酷,我喜欢它,但我们的课程并没有真正深入研究 .net 库。但我确实得到了 i % j == 0;声明。
【解决方案4】:

我认为您需要向我们提供更多信息。你的算法有什么要求?它必须有一个特别好的运行时间吗?您可以使用哪些功能?

如果没有限制,我会说只是循环遍历小于输入的整数 x 并检查输入 / x 是否为整数,如果是则 x 是一个因子。

【讨论】:

  • 您不必检查超出x + 0.5 的平方根。
  • 哦,是的。 25 是 50 的因数,25 大于 8。
【解决方案5】:

我假设你已经编写了程序,但是 w/e.

% 操作员在这里是你的朋友。

x % y = 0 当且仅当 x 可被 y 整除(表示没有余数,表示 y 是 x 的因数)。

在 C# 中,要获得 50 的因数,以下操作必须为真:

    if(50 % x == 0)
       Console.WriteLine(x + " is a factor of 50");

这是一种将 50 的因数从 1 到 100 的粗略方法:

     int toTest = 50;
     for(int x = 1; x < toTest; x++)
     {
         if(toTest % x == 0)
             Console.WriteLine(x + " is a factor of 50");
     }

【讨论】:

  • 是的,我基本上做了蛮力版。
  • 我正在研究如何尝试改进它。
【解决方案6】:

朴素算法是尝试将输入数字n 除以所有小于Math.Sqrt(n) + 0.5 的数字。这很适合学习。

所以,在伪代码中:

integer n from user input
for each integer i in the range 1 to sqrt(n) + 1/2 do
    r = remainder of n divided by i
    if r is zero print i and n/i

【讨论】:

  • 如果您使用 Sqrt(n) + 0.5 作为范围,则必须将 n/i 的结果添加到您的因子列表中。例如您的伪代码检测到 2 是 50 的因数,但没有找到 25。
  • @10bithacker:你是对的。感谢您纠正我的疏忽。
猜你喜欢
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 2017-07-21
  • 2020-11-23
  • 2011-07-19
  • 2020-02-03
  • 1970-01-01
相关资源
最近更新 更多