2014-10-29 60 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後纔將循環改爲乘。但這也意味着必須將循環中的最終階乘打印出來。