我需要提出的算法是计算用户输入数字的所有因子,例如用户输入“50”,程序将显示50的所有因子:1,2 ,5,10,25,50。
此程序需要适用于所有正整数值。
有人愿意告诉我该怎么做吗?这不是家庭作业,它只是学习材料,而且我一直在努力解决这个问题超过2小时。我应该使用数组吗?
答案 0 :(得分:5)
这是一个线索:如果Y / X没有余数,则数字X是Y的因子。另一条线索:在大多数语言中都有常见的数学运算符来发现一个数字除以另一个数字是否有余数。
答案 1 :(得分:1)
首先,尝试一种天真/暴力的方法。
例如,你可以遍历1和用户提供的[希望相对较小]数字之间的所有数字,并检查它是否均匀地划分了这个数字。
顺便说一句,您可以使用模运算符来断言给定整数可以被另一个整数整除的事实(或者更确切地说,模运算的结果应该是一个特定的值)。 / p>
一旦你完成这项工作,你就可以想到迭代中的一些数字可以被消除的方式。这种方法在解决问题时并不罕见:
1)以天真的方式解决问题
2)寻找切割/过滤/修剪的方法,并以其他方式改进天真的方法
如果不出意外,天真的方法提供了一个良好的基线,并且,因为它也更简单,它也可以用来验证更复杂的方法的输出。
使用此解决方案后,您可以尝试一种独特的方法。我们的想法是将数字分解为其主要因素。在这个例子中,50将给出(1,2,5,5,50),然后你需要枚举这些素因子的所有组合(不包括平凡的,1和50)。主要因素分解通常应该是直截了当的(想想你在早期数学类中学习它的方式),但是所有可能组合的枚举可能会导致你暂停一下(这是一种不断进入的算法类型)时尚或其他CS应用程序)。
答案 2 :(得分:1)
我可能会选择更简单的.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的所有数字(数字到因子)来工作。内环通过相同的数字集来查看模数是否为零(无余数)。一旦找到一个,我们继续前进,否则我们会得到重复。
另请注意,这是最糟糕的情况(强力)算法。
答案 3 :(得分:0)
我认为您需要向我们提供更多信息。您的算法有哪些要求?是否必须有一个特别好的运行时间?您可以访问哪些功能?
如果没有限制,我会说只循环整数x小于输入并检查输入/ x是否是整数,如果是,则x是一个因子。
答案 4 :(得分:0)
朴素算法是尝试将输入数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
答案 5 :(得分:0)
我假设你已经编写了程序,但没有。
%运营商是您的朋友。
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");
}