[英]The while and do-while loops The smallest value
我需要編寫一個程序,讓用戶輸入一個長正數 m。 我需要找出最小的整數 n 是多少,使得 n! > 米。
到目前為止,我已經編寫了這樣的代碼:
import java.util.*;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner (System.in);
long number = scanner.nextLong();
int fact = 1;
int count =1;
while (fact <= number) {
count ++;
fact *=count;
}
System.out.println(count);
}
}
測試輸入:6188989133 正確輸出:13
您的代碼輸出:
我的代碼輸出是空的。 我在這里缺少什么?
您必須對fact
變量使用long
。 當您使用int
,可能的值介於-2,147,483,648
和2,147,483,647
之間。
但是,您永遠不會超過輸入數字6,188,989,133
,因此您的while(fact <= number)
循環永遠不會退出。 每個可能的整數值都將小於6,188,989,133
。 這解釋了為什么你的代碼輸出是“空的”,因為它沒有到達System.out.println(count);
線。
請記住, long
類型也有這樣的限制,值只能介於-9,223,372,036,854,775,808
和9,223,372,036,854,775,807
之間。 當輸入數字那么大時,您將找不到大於輸入的正確fact
值,因為您受到long
類型值范圍的限制。 例如,對於輸入數字9,000,000,000,000,000,000
(在long
類型值范圍內),下一個階乘數是51,090,942,171,709,440,000
( 21!
的值),它在long
類型值范圍之外。
您可以使用具有“無限”可能值范圍的java.math.BigInteger
類,並對BigInteger
對象進行數學運算。
fact
應該聲明為long
。 檢查下面的代碼:
public class TestJava {
public static void main(String[] args) {
try{
System.out.println("Input number: ");
Scanner scanner = new Scanner (System.in);
long number = scanner.nextLong();
if(number >= 2432902008176640000L) {
// log an appropriate message like can not handle
// long value greater than 2432902008176640000L
return 21;
}
long fact = 1;
int count =1;
while (fact <= number) {
count ++;
fact *=count;
}
System.out.println("output: "+ count);
}catch(Exception e){
e.printStackTrace();
}
}
}
更新(警告):
正如@Pshemo 提到的, if condition
,上面的代碼在 20 之前都可以!但之后會導致無限循環問題。 因此,必須注意這種情況。 代碼已相應更新。
您需要將fact
類型更改為 long
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.