簡體   English   中英

while 和 do-while 循環 最小值

[英]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,6482,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,8089,223,372,036,854,775,807之間。 當輸入數字那么大時,您將找不到大於輸入的正確fact值,因為您受到long類型值范圍的限制。 例如,對於輸入數字9,000,000,000,000,000,000 (在long類型值范圍內),下一個階乘數是51,090,942,171,709,440,00021!的值),它在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM