3
import java.util.Scanner;


public class SumDigits {

public static void main(String[] args)
{
    // TODO Auto-generated method stub

    Scanner input = new Scanner(System.in);

    // prompt the user to enter a value and store it as the integer called number
    System.out.print("Enter an integer: ");
    double number = Math.abs(input.nextDouble());

    System.out.println("The sum of the digits is " + sumNumbers(number));

    input.close();
}
public static int sumNumbers (double number)
{

    int sum = 0;

    for (int i = 10, digit = 0; (number * 10) /i !=0; i *= 10, digit = (int)((number % i) - digit)/(i / 10))
    {
        sum += digit;
    }

    return sum;
}
}

実行時にエラー メッセージが表示される

スレッド「メイン」での例外 java.lang.ArithmeticException: / by zero

25行目(私のforループ条件)を参照してください。

数字の値を int に型キャストするまでは、ループは正常に機能していましたが、ループの一部で何かがゼロで除算される理由がよくわかりません。有理式を使用する条件に関するすべての可能性を検討しましたが、分母がゼロに設定される不測の事態を推測することはできません。入力した数字に関係なく、このエラーが発生します。私の教授が彼のテストケースの 1 つで int 内に格納できる値を超える値を提供したという事実がなければ、number を double として保存することを選択しなかったでしょう。プログラムは、型キャストの前に正常に実行され、他のすべてのテスト ケースに対して正しい答えを提供しました。

4

3 に答える 3

0

コントロールが最初にループに入ると、値はdigitゼロになり、期待したように入力された数値の最後の桁ではありません。また、ループ終了条件が間違っているため、修正する必要があります。たとえば、number が 123 の場合、最後に予想される反復1230/1000 = 1と not0およびループは終了せず、むしろオーバーフローにつながります。以下を使用できます。

public static int sumNumbers (double number)
    {
        int sum = 0;
        for (int i = 10, digit = (int)(number % i); digit != 0; i *= 10, digit = (int)((number % i) - digit)/(i / 10))
        {
            sum += digit;
        }

        return sum;
    }

これは機能するはずですが、これは理想的な方法ではないため、このコードを改善することをお勧めします。

テスト:

Enter an integer: 3456 The sum of the digits is 18

于 2015-09-23T04:37:13.487 に答える
0

ArithmeticException の根本的な原因は、不適切なループ条件です。System.out.println("i=" + i + " i*10=" + (i * 10));ループに追加すると、出力が生成されます。

i=10 i*10=100
i=100 i*10=1000
i=1000 i*10=10000
i=10000 i*10=100000
i=100000 i*10=1000000
i=1000000 i*10=10000000
i=10000000 i*10=100000000
i=100000000 i*10=1000000000
i=1000000000 i*10=1410065408
i=1410065408 i*10=1215752192
i=1215752192 i*10=-727379968
i=-727379968 i*10=1316134912
i=1316134912 i*10=276447232
i=276447232 i*10=-1530494976
i=-1530494976 i*10=1874919424
i=1874919424 i*10=1569325056
i=1569325056 i*10=-1486618624
i=-1486618624 i*10=-1981284352
i=-1981284352 i*10=1661992960
i=1661992960 i*10=-559939584
i=-559939584 i*10=-1304428544
i=-1304428544 i*10=-159383552
i=-159383552 i*10=-1593835520
i=-1593835520 i*10=1241513984
i=1241513984 i*10=-469762048
i=-469762048 i*10=-402653184
i=-402653184 i*10=268435456
i=268435456 i*10=-1610612736
i=-1610612736 i*10=1073741824
i=1073741824 i*10=-2147483648
i=-2147483648 i*10=0
于 2015-09-23T04:48:25.017 に答える