2017-04-19 53 views
-3

這是我應該做的事:階乘與計數控制或定點回路中的Java

寫Java程序,它會計算一些數的階乘N(來自用戶的輸入,只接受範圍1 - 10)。對於輸入中的每個有效數字,輸出應該是n!的值。你的程序應該使用一個循環,以允許用戶輸入多個號碼(計數控制或定點控制,你的選擇)

這是我的時刻:

public static void main(String[] args) 
{ 
    Scanner console = new Scanner(System.in); 

    int num, result = 1; 
    String str; 

    System.out.print("Do you want to start? (y/n) "); 
    str = console.next(); 
    System.out.println(); 

    while(str.charAt(0) == 'y') 
    { 
     System.out.print("Enter an integer (1 - 10): "); 
     num = console.nextInt(); 

     if(num < 1 || num > 10) 
     { 
      System.out.print("NUMBER OUT OF RANGE!"); 
      num = console.nextInt(); 

     } 
     else 
     { 
      int i = 2; 
      while(i <= num) 
      {     
       result = result * i; 

       i++; 
      } 
      System.out.println(num + "! = " + result); 
      System.out.println(); 

      System.out.print("Do you want to continue? "); 
      str = console.next(); 
     } 
     System.out.println(); 
    } 
} 

但這是我的結果:

Do you want to start? (y/n) y 

Enter an integer (1 - 10): 1 
1! = 1 

Do you want to continue? y 

Enter an integer (1 - 10): 2 
2! = 2 

Do you want to continue? y 

Enter an integer (1 - 10): 3 
3! = 12 

Do you want to continue? y 

Enter an integer (1 - 10): 4 
4! = 288 

我不能輸出到顯示正確的結果,這是我與我的程序,具有唯一的問題。此外,它顯示正確的結果第一次你被要求輸入一個整數,但在此之後,一切都出錯

+0

這既不是計數控制也不哨兵受控。 – dasblinkenlight

+0

你正在覆蓋每個新號碼的'result'變量。所以你需要爲每次迭代設置'result = 1;'。這是錯誤 – Teocci

回答

0

試試這個代碼:

import java.util.Scanner; 

public class Main { 

    public static void main(String[] args) { 
     Scanner console = new Scanner(System.in); 

     String str; 

     System.out.print("Do you want to start? (y/n) "); 
     str = console.next(); 
     System.out.println(); 

     int num, result; 
     while (str.charAt(0) == 'y') { 
      System.out.print("Enter an integer (1 - 10): "); 
      num = console.nextInt(); 

      while (num < 1 || num > 10) { 
       System.out.println("NUMBER OUT OF RANGE!"); 
       System.out.print("Enter an integer (1 - 10): "); 
       num = console.nextInt(); 
      } 

      int i = 2; 
      result = 1; 
      while (i <= num) { 
       result = result * i; 
       i++; 
      } 

      System.out.println(num + "! = " + result); 
      System.out.println(); 

      System.out.print("Do you want to continue? "); 
      str = console.next(); 

      System.out.println(); 
     } 
    } 
} 
+0

謝謝,這個作品! – JakeBrono46

+0

如果此代碼有效,請將您的問題標記爲已回答。 – Teocci

0

你需要設置result = 1內部while循環,而不是在它之前。這裏發生的事情是,你正在乘數的數字乘以前面迭代的外環while的結果。

+0

謝謝,這工作! – JakeBrono46

0

當您迭代一個新值時,您沒有重置result。 只需將結果重置爲1,然後再開始計算階乘 -

while(str.charAt(0) == 'y') { result =1;

0

我覺得你有與您的if語句的邏輯錯誤。射程爲1-10,你的if語句應該是這個樣子:

if(userInput>0 && userInput<=10); 

而且,什麼大衛·華萊士曾表示,你需要你的內心「因子後您的變量i重新初始化回到1 while循環「結束。通過這種方式,只要它進入內部階乘while循環,變量i始終具有1的起始值。

0

我會開始通過創建有效範圍的階乘的查找表。這可以迭代完成,創建一個fact數組並填充它。喜歡的東西,

int[] fact = new int[10]; 
int i; 
fact[0] = i = 1; 
while (i < fact.length) { 
    fact[i] = (i + 1) * fact[i - 1]; 
    i++; 
} 

然後你可以用一個無限循環與Scanner(打破非整數輸入)和fact查找表像,

Scanner scan = new Scanner(System.in); 
while (true) { 
    System.out.println("Enter a number 1-10 for the factorial (or a " 
      + "non-number to quit): "); 
    if (!scan.hasNextInt()) { 
     break; 
    } 
    i = scan.nextInt(); 
    if (i < 1 || i > 10) { 
     System.out.println("NUMBER OUT OF RANGE!"); 
     continue; 
    } 
    System.out.printf("%d! = %d%n", i, fact[i - 1]); 
}