2009-11-17 22 views
0

我需要提出的算法是计算用户输入数字的所有因子的算法,例如用户输入“50”,程序将显示所有50的因子,它们是:1,2, 5,10,25,50.如何创建一个计算C#中整数因子的算法?

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

有人愿意告诉我该怎么做吗?这不是家庭作业,它只是研究材料,我一直在试图找出这个问题超过2小时。我应该使用数组吗?

+0

你知道http://projecteuler.net吗?公主, – 2009-11-17 02:43:52

+0

公顷,不,我没有,但现在我做,感谢那个链接,那些看起来很酷和有趣。 – Alex 2009-11-17 02:52:01

+0

相关问题在[python](http://stackoverflow.com/q/3643725/6899) – tzot 2010-10-09 01:47:25

回答

5

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

+0

你的意思是,如果没有余数? – Tesserex 2009-11-17 02:46:25

+0

我认为你的意思是'Y/X'有零余数。 – jason 2009-11-17 02:46:48

+0

Darnit,Tesserex,你在编辑之间的20秒内抓住了我。是的,那是一个愚蠢的错误。 – 2009-11-17 02:47:18

0

我想你需要给我们更多的信息。你的算法有什么要求?它是否必须有一个特别好的运行时间?你有什么功能可以访问?

如果没有限制,我会说只是循环通过整数x小于输入,并检查是否输入/ x是整数,如果是这样,那么x是一个因子。

+0

你不必检查'x + 0.5'的平方根。 – jason 2009-11-17 02:47:57

+1

哦,是的,你这样做。 25是50的因子,25是大于8. – 2009-11-17 03:13:42

0

天真的算法是尝试用小于Math.Sqrt(n) + 0.5的所有数字来划分(或检查余数)输入数字n。这对学习很好。

因此,在伪代码:

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 
+0

如果您使用Sqrt(n)+ 0.5作为范围,则必须将n/i的结果添加到您的因子列表中。例如你的伪码检测到2是50的因子,但没有找到25. – 10ToedSloth 2009-11-17 03:49:36

+0

@ 10bithacker:你说得对。感谢您纠正我的疏忽。 – jason 2009-11-17 11:54:47

1

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

例如,您可以遍历1和用户提供的[希望相对较小]的数字之间的所有数字,并检查它是否平均分配这个数字。

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

一旦你有这个工作,你可以想到迭代中的一些数字可以被消除的方式。这种方法在解决问题中并不罕见:
  1)以天真的方式解决问题,并且
  2)寻找减少/过滤/修剪并以其他方式改进朴素方法的方法。
如果没有别的办法,天真的方法提供了一个很好的基线,而且,因为它也更简单,它也可以用来验证更复杂方法的输出。

一旦你玩了这个解决方案,你可以尝试一个独特的方法。这个想法是将数字分解为主要因素。在这个例子中,50会给出(1,2,5,5,50),然后你需要枚举这些素数因子的所有组合(不包括微不足道的1和50)。素数因子分解通常应该是直截了当的(考虑在早期的数学课中学习它的方式),但列举所有可能的组合可能会导致暂停一点(然而这是继续进入的算法的类型时尚或其他CS应用程序)。

+0

啊,谢谢!我没有想到暴力强制它,但我会尝试看看。 – Alex 2009-11-17 02:50:34

+0

嘿感谢更大的解释,它帮助我从逻辑上思考它。 – Alex 2009-11-17 04:59:11

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的所有数字(数字到因子)。内循环通过同一组数字来查看模数是否为零(无余数)。一旦发现我们继续前进,否则我们会得到重复。

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

+0

这很酷,而且我喜欢它,但是我们的课并没有真正钻研.net库。但我确实得到了i%j == 0;声明。 – Alex 2009-11-17 04:56:13

0

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

%operator是你的朋友在这里。

x%y = 0当且仅当x可被y整除(意味着没有余数,意味着y是x的一个因子)。

在C#中,拿到50的因素,下面的操作必须是真实的:

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

这里是从1到100获得的50因素的野蛮方式:

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

是的,我基本上做了蛮力版本。 – Alex 2009-11-17 05:00:02

+0

我正在考虑如何尝试对此进行优化。 – Alex 2009-11-17 05:01:15