Значение делителя в цикле загадочно (?) Меняется - PullRequest
0 голосов
/ 14 марта 2019

Так что я занимаюсь этим часами, и, честно говоря, я полностью застрял.Я написал цикл for, который подсчитывает количество чисел в целом числе, но обнаружил, что значение делителя изменяется, когда я ввожу число, превышающее 10 цифр, и я не могу понять, почему.Я искал в Интернете безрезультатно, поэтому я был бы признателен за любую помощь или советы, если у вас есть.Спасибо!

 public static int getNumberOfDigits(long creditCardNumber)
{
    //problem with 0's at beginning and more than 10 digits
    int nDigitsInCard = 0;
    int divisor = (int) creditCardNumber;
    for(int i = 0; i <= creditCardNumber; i++){
        while(divisor!=0){
            divisor/=10;
            ++nDigitsInCard;
        }
}
    // return the number of digits in nDigitsInCard

    return nDigitsInCard;
}

Ответы [ 3 ]

1 голос
/ 14 марта 2019

Целые числа могут содержать только числа до 2 ^ 32 - 1. Кроме того, почему вы преобразуете входной параметр в целое число?

Другое дело, что вы подсчитываете количество цифр в каждой цифре, ведущейдо делителя, поскольку вы выполняете цикл от 0 до creditCardNumber в for(int i = 0; i <= creditCardNumber; i++){ ... }.Так, например, 10000 вернет количество цифр в 1, количество цифр в 2, вплоть до 10000.

Наконец, всю функцию можно выполнить в одной строке с помощью

return Long.toString(creditCardNumber).length();

или

return creditCardNumber.toString().length();

, если вы измените creditCardNumber на Long вместо long, но вам придется вызывать его с суффиксом l в конце.

Если вы хотите что-то еще короче, вы можете сделать

return (creditCardNumber+"").length();
1 голос
/ 14 марта 2019

int s не может содержать числа больше 2 147 483 647.Вам нужно придерживаться long s для работы с большими числами.

0 голосов
/ 14 марта 2019

Если число превышает 10 цифр, преобразование в целое число не завершается, поскольку целое число не может содержать значения больше 2 ^ 31 - 1 или 2 147 483 647, то есть числа, состоящего всего из 10 цифр. Я рекомендую придерживаться long.

...