簡體   English   中英

為什么對於某些值我會出錯,而對於另一些值我卻沒有?

[英]Why for some values im getting an error but for others im not?

我正在嘗試創建一種方法,該方法采用用戶輸入的數字,測試數字中的每個數字是否為奇數,如果所有數字均為奇數,則返回true,如果所有數字為偶數,則返回false。 這是代碼。

    public static boolean allDigitsOdd(int num){

    int digits[] = new int[10];
    int numDigits = 0;
    String numTemp = Integer.toString(num);

    while(num > 1){
        num = num/10;
        numDigits++;
    }
    numDigits++;

    for(int i = 0; i < numDigits; i++){
        digits[i] = numTemp.charAt(i) - '0';
        System.out.println(digits[i]);
    }

    for(int i = 0; i < numDigits; i++){
        if(digits[i] % 2 == 0){
            return(false);
        }
        if(i == numDigits){
            return(true);
        }
    }
    return(true);
}

當我輸入'1234'或'1357'時,它可以很好地工作並返回正確的布爾值,但是當我鍵入幾乎所有其他內容時,它給我一個'String index out of range'錯誤。

    digits[1] = numTemp.charAt(i) - '0';

while(num > 1)更改為while(num >= 10)

否則,它僅適用於以1開頭的數字(例如1234和1357),因為對於以2到9開頭的數字(例如9436534或4334),您的numDigits計算將過高,導致“字符串索引超出范圍”。

最好忘記numDigits而只需使用numTemp.length()

我會用另一種方式解決。

不要將您的數字轉換成字符串(可以為您提供科學的計數法值和/或數千個定界符等),而是將最后一位數字斬除並除以10得到一個新數字,就像這樣(遞歸!):

public static boolean allDigitsOdd(int num){

    if (num < 0) {
        throw new IllegalArgumentException("num must be 0 or positive");
    }

    if (num < 10) { // for 0-9, this is easy 
        return (num % 2 != 0); // if it isn't even, it's odd
    } else { // here comes the fun part
       int lastDigit = num % 10; // % is the remainder operation, not the modulo operation
       int newNum = num / 10; // because this is how ints work, this chops off the last digit
       return (lastDigit % 2 != 0) && allDigitsOdd(newNum); // recursion fun!
       // This will only return true if all of the tested digits are odd;
       // If there is just one even digit, the && operator returns false
    }
}

System.out.println(allDigitsOdd(1242)); // false
System.out.println(allDigitsOdd(73335799)); // true

您可以使用二進制運算符來執行此操作,但這只會使它的可讀性降低,並且速度不那么快。

您甚至可以將所有內容放入一個簡單的循環中:

public static boolean allDigitsOdd(int num)
{
    while(num != 0)
    {
        if(num % 2 == 0)
            return false; // last digit is even
        num /= 10; // cut of last digit and repeat
    }
    return true; // all digits were odd
}

這甚至適用於負數!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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