Ошибка говорит, что она делится на ноль, а не инициализируется как ноль - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь выяснить, является ли число автоморфным, код компилируется нормально, но он говорит, что в строке, где я его пометил, есть деление на ноль

import java.util.Scanner;
class AutoLoop
{
    public static void main()
    {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter a number to check if it's automorphic or not");
        int num = sc.nextInt();
        int sqr = num*num;
        int sqrSave=sqr;
        int divisor = 10;
        int counter = 1;
        while (counter<=100)
        {
            sqr = sqr%divisor;  //It says there is divide by zero error on this line
            if (sqr==num)
            {
                System.out.println("Number is an automorphic number");
                break;
            }
            sqr=sqrSave;
            divisor*=10;
            counter++;
            if (counter == 100)
                 System.out.println("Number is not an automorphic number till the 100th digit.");
        }
    }
}

Я уже пытался сделать это% = SQR делитель;все еще не работает.

Ответы [ 3 ]

2 голосов
/ 29 октября 2019

Я проверил ваш код, и похоже, что вы пытаетесь умножить переменную делителя за пределы 32-разрядного целочисленного предела, и, поскольку это невозможно, он становится некоторыми другими числами, и через некоторое время он превращается внуль. Это происходит каждый раз, когда вы вводите неавтоморфное число

Это значение делителя каждый раз, когда ваш код повторяется:

10

100

1000

10000

100000

1000000

10000000

100000000

1000000000

1410065408

1215752192

-727379968

1316134912

276447232

-1530494976

1874919424

1569325056

-1486618624

-1981284352

1661992960

-559939584

-1304428544

-159383552

-1593835520

1241513984

-469762048

-402653184

268435456

-1610612736

1073741824

-2147483648

0

Исправление для этого может заключаться в том, чтобы сделать делительдвойное число или число с плавающей точкой вместо целого числа

1 голос
/ 29 октября 2019

Первоначально делитель равен 10. Затем цикл заставляет делитель умножаться на сто с лишним раз на 10, давая 10 101 . Это переполняет диапазон int несколько раз, так как 2 31 составляет примерно 2 * 10 30 .

Особенно 10 1000 = 2 100 * 5 100 , поэтому после цикла 32 раза, умножать каждый раз на 2, все биты divisor равны нулю.

Если при переполнении divisor становится0 вы получаете такое деление на ноль ошибок. Поскольку по модулю % абстрактно подразумевается внутреннее деление (по модулю это остаток от деления).

0 голосов
/ 29 октября 2019
import java.util.Scanner;
class AutoLoop{
    public static void main(){
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter a number to check if it's     automorphic or not");
        int num = sc.nextInt();
        int sqr = num*num;
        int sqrSave=sqr;
        int divisor = 10;
        int counter = 1;
        /* try with 10 and see the result. 100 is too big*/
        while (counter<=100){
            sqr = sqr%divisor;
            if (sqr==num){
                System.out.println("Number is an automorphic number");
                break;
            }
            sqr=sqrSave;
            divisor*=10;
            counter++;
            // try with 10 or an other number smaller than 100
            if (counter == 100)System.out.println("Number is not an automorphic number till the 100th digit.");
    }
}
...