2014-10-29 45 views
1

我试图找到9的阶乘降到0,只使用一个while循环,但我的想法并不是输出一个值。仅使用一个while循环进行阶乘

我想出的办法做到这一点使用两个while循环:

int i; 
    count = 9; 
    while (count >= 0){ 
     value = count; 
     i = count-1; 
     while (i > 0){ 
      value = value * i; 
      i--; 
     } 
     System.out.print(value + ", "); 
    } 

这个工作,但我试图将其更改为只使用一个while循环,并得到这个:

int i; 
    for (count = 9; count < 0; count--){ 
     value = count; 
     i = count-1; 
     while (i > 0){ 
      value = value * i; 
      i--; 
     } 
     System.out.print(value + ", "); 
    } 

我不完全确定,如果我正确使用for语句,但我认为我是,或者至少我认为它应该输出一些东西,以便我可以调试它。

有人能给我一个正确的方向提示吗?

+0

ü可以同时使用一个for循环与while循环? – mlwn 2014-10-29 11:54:24

+1

'for(count = 9; count <0; count - )'表示:以'count'开头为'9';只要'count'小于'0'就循环;在每次迭代中将count减1。所以你看,'count <0'应该是'count> = 0'。 – Tom 2014-10-29 11:54:46

+2

您不应该需要两个循环(用于OR while)来计算阶乘。再想想你的算法。 – 2014-10-29 11:55:00

回答

4

这会给你从9降到1的所有因子:

int i=1; 
int value=1; 
String res = ""; 
while (i <= 9){ 
    value = value * i; 
    res = value + ((i>1)?",":"") + res; 
    i++; 
} 
System.out.print(res); 

输出:

362880,40320,5040,720,120,24,6,2,1 

也许这是欺骗,因为我计算升序阶乘从1!9!,但我倒车,以获得所需结果的输出顺序。

编辑:

如果您还想要0!要打印,小改可以做的伎俩:

int i=1; 
int value=1; 
String res = ""; 
while (i <= 10){ 
    res = value + ((i>1)?",":"") + res; 
    value = value * i; 
    i++; 
} 
System.out.print(res); 

输出:

362880,40320,5040,720,120,24,6,2,1,1 
+0

到目前为止,有没有什么机会可以解释这一行? '解析度=值+((I> 1) “ ”:“? ”)+ RES;' – Defa1t 2014-10-29 12:23:28

+0

@ Defa1t中间的奇怪部分只是为了避免一个额外的“,” 在输出结束时(它仅在i> 1时才添加“,”)。该行在先前计算的阶乘之前添加下一个阶乘,以便输出反转(从9开始并以1结尾!)。 – Eran 2014-10-29 12:28:52

0
count = 9; 
sum=1; 
while (count >= 1){ 
sum*=count; 
--count; 
} 
    System.out.print(sum); 

它会给你09!= 362880

1

就先分配值=我,然后运行你的循环。只有while循环才能获得阶乘。

重要:因为n!=n*(n-1)!,因此,i--应该必须value = value * i之前执行。

public static void main(String args[]) { 

      int value=5; 
      int i=value; 
       while (i > 1){ 

        i--; 
        value = value * i; 
       } 
       System.out.print(value); 

    } 

更新:如果你要计算的0到9的阶乘,然后使用此代码:(它包括的0也阶乘)

public static void main(String args[]){ 
     int countLowest=0; 
     int countHighest=9; 
     int value=1; 


       while (countLowest<= countHighest){ 
       if(countLowest==0) 
        value = value * (countLowest+1); 
       else 
        value=value*countLowest; 
       countLowest++; 
       System.out.println("Factorial of "+(countLowest-1)+" is "+value); 
       } 

    } 

结果:

Factorial of 0 is 1 
Factorial of 1 is 1 
Factorial of 2 is 2 
Factorial of 3 is 6 
Factorial of 4 is 24 
Factorial of 5 is 120 
Factorial of 6 is 720 
Factorial of 7 is 5040 
Factorial of 8 is 40320 
Factorial of 9 is 362880 
+1

我相信这个想法是用一个while循环从9到0的所有阶乘。你只计算一个因子。 – Eran 2014-10-29 12:01:57

+0

对不起,我没有注意到它。在这种情况下,结果也应该显示0的阶乘,我只是更新了我的代码。 – Tarek 2014-10-29 12:22:17

+0

如果订单很重要,只需将结果初始存储在一个数组中并以相反方式打印就足够了。 – Tarek 2014-10-29 12:25:15

1

首先,为什么你的第二个循环不工作的原因是,你必须在for错误条件。中间的情况是会导致回路继续,而不是停止。所以你所说的是“从9开始,在数字小于0的情况下工作”。但是,当然,你的数字大于零开始。

其次,我认为使用for循环有点作弊,因为for循环只是while循环的一个特例。

现在阶乘本身的问题。你知道一个因子n!被定义为(n-1)!* n。

计算一个特定的阶乘的基本循环是:

int n = 5; 
int factorial = 1; 

while (n > 0) { 
    factorial *= n; 
    n--; 
} 

System.out.println("Factorial is: " + factorial); 

这会给你的五个因子。但它并不完全基于我们正在谈论的公式。还有另一种方式来计算的话,从1开始:

int n = 5; 
int factorial = 1; 
int count = 1; 
while (count <= n) { 
    factorial *= count; 
    count++; 
} 
System.out.println("Factorial is " + factorial); 

关于做这种方式的有趣的是,在循环的每一个阶段,factorial实际上是值(计-1)!我们正在乘以数量。这正是我们正在谈论的公式。

而且关于它的好处是,你这样做只是之前,你有以前的阶乘的值。所以,如果你打印它,那么你会得到一个所有的因子的列表。所以这里是一个修改后的循环,打印所有的阶乘。

int n = 9; 
int factorial = 1; 
int count = 0; 
while (count < n) { 
    System.out.println("Factorial of " + count + " is " + factorial); 
    count++; 
    factorial *= count; 
} 
System.out.println("Factorial of " + n + " is " + factorial); 

请注意,我对它进行了一些修改,使其可以与零一起工作。零阶乘是一个特殊情况,所以我们不应该乘以零 - 这将使所有因子错误。所以我只是在将count增加到1后才将循环改为乘。但这也意味着必须将循环中的最终阶乘打印出来。