2014-01-30 46 views
0

所以我有这种方法可以找到给定数字的因子数。它工作正常,但一切,但我使用for循环,我的老师想让我把它改成一个while循环,使其更有效率,试图改变它,但我一直得到无尽的循环这里是我有使用的代码for循环什么可能是一个很好的将其更改为一个while循环,而无需使用休息,只为在全法一个return语句使用while循环查找因子数

public static int numberOfFactors(int num){ 
    int i; 
    int total=0; 
for(i=1;i<=num;i++){ 
    if(num%i==0) 
     total++; 
} 
    return (total);} 
+0

然后告诉你有什么用做while循环:) –

+1

我不确定你使用的是什么语言,但是在几种编译语言中while循环最终具有相同的字节码。 –

+0

不知道这是否适用于科幻类或数学课,但是有一些数字属性可以帮助您提高算法的效率。例如,如果num%P == 0且num%Q == 0,则对于所有(P * Q)<=(num/2),num%(P * Q)== 0。 –

回答

3

我看不出:

i = 1; 
while(i <= num) { 
    // do things 
    i++; 
} 

是任何效率高于:

for(i=1; i<=num; i++) { 
    // do things 
} 

据我所知,不是!我很想知道你的老师为什么这么认为。


这就是说,这里是你可以做什么,使之更加高效:

  • 计算num平方根,并把它作为sqrtnum整数,四舍五入。
  • 你的循环更改为for(i=1; i<sqrtnum; i++)(注意<,不<=
  • 如果num%i==0,通过2增加total,而不是1
  • 循环后,检查是否sqrtnum*sqrtnum == num - 如果是的话,增量total1

这样,你只需要通过数字的一小部分循环;)

+0

我会同意这是OP的低效率算法,而不是他/她选择的循环结构。 –

+0

是啊我不知道为什么我的老师告诉我所有这些他是真正的肛门回合做他的方式和东西 – vickes

+0

如果他是我的老师,我会打开一个由数组组成的代码,将整数键映射到数字作为一个价值因素,实际上它们的数值一直高达千分之一,并且代码的输入高于1,000:[PanicSort](http://xkcd.com/1185/):D –

0

没有任何更有效,但....

public static int numberOfFactors(int num) { 
    int total = 0; 
    int i = 1; 

    while(i <= num) { 
    if(num%i == 0) 
     total++; 
    i++; 
    } 

    return total; 
}