Здравствуйте, программисты!
По наитию решил задачу с разбиением числа, но сам математический алгоритм остался для меня не понятен. Прошу старших товарищей прояснить этот момент.
Вот код:
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int num_length = Integer.toString(num).length()
for (int i = 0; i < num_length; i++) {
if (num % 2 == 0) even++;
else odd++;
num = num/10;
}
System.out.println();
System.out.println("Even: " + even +" Odd: "+ odd);
Возьмем для примера число 4574, алгоритм выдаст 2 : 2 (два четных - два нечетных)
Сначала проверит всё число 4574 на кратность двум: 2 287 => even +1;
Затем проверит 457 на кратность двум: 228,5 => odd +1;
И так далее.
Вопрос. Алгоритм не проверяет каждую из цифр 4 5 7 4 по отдельности, он проверяет цифры 4574, 457, 45 на кратность двум. Как выходит так, что этот подход является аналогичным тому, что мы проверяем каждую цифры в отдельности?
Спасибо
Sergei Polushin
15 уровень
Решил задачу, но непонятен алгоритм :(
Решен
Комментарии (6)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
SergM
3 мая 2020, 06:58
Мне кажется эта штука не совсем к программированию относится на 100%, и больше к математике. Я думаю дело в том, что четность определяет последнее число в цифре, и не важно сколько у нее разрядов. Если в обратную сторону раскрутить это, то например 1 нечетное число. 81 тоже. 481 тоже, 7481 тоже и т.д. так как в конце стоит 1.
0
Sergei Polushin
3 мая 2020, 07:01
Да, вопрос больше по математике. Признак делимости на два мне известен. Не понятно, почему следующие проверки числа 4574 тождественно равны (4574/2, 457/2, 45/2 и 4/2) == (4/2, 5/2, 7/2, 4/2)
0
SergM
3 мая 2020, 07:12
Так ты же делаешь num = num/10; каждый раз в цикле уменьшая разряд числа каждый проход. Вот и получается, что (4574/2, 457/2, 45/2 и 4/2) == (4/2, 5/2, 7/2, 4/2). То есть, сначала у тебя 4574. Как мы уже выяснили, не важно какое число и сколько разрядов. Важна последняя цифра. Это четыре. следовательно 4/2 четное поэтому even++. Дальше как раз и происходит num = num/10 т.е. 4574/10 = 457,4, но так как num это int Тип, то дробная часть отбросится и num будет равен 457. Дальше алгоритм повторится. 457/10 = 45,7 => num = 45 и т.д.
+2
SergM
3 мая 2020, 07:37решение
Я кажется понял в чем у тебя не понимание.
Ты вот написал "Затем проверит 457 на кратность двум: 228,5 => odd +1;"
Нет, это не совсем так работает. Да с точки зрения математики 457/2 = 228,5 если округлить будет 229. И это да нечетное число, по этому odd +1, как ты думаешь. Но тут все не так. Примитив int понимает только целые числа. То есть для него дробной части не существует, он ее не видит. По этому для него 228,5 = 228. Это первый момент.
Второй, вот этот символ % означает деление с остатком. Поищи в нете "Java деление с остатком", все станет понятно. Там простая логика. В данном конкретном случае 457 % 2 означает, что в числе 457 может "поместиться" число 2 аж ЦЕЛЫХ 228 раз. И один раз не поместиться. 457 - 228 * 2 = 1. Это и есть остаток. Это как раз и есть результат деления с остатком. По этому вот это условие if (num % 2 == 0) even++ не выполнится, а вот это условие else odd++; выполнится. Если поделить например 10 % 2, то результат будет 0, так как 2 помещается в 10 ровно 5 раз.
+4
Sergei Polushin
3 мая 2020, 09:46
Спасибо, буду разбираться🙃
0
Юра
3 мая 2020, 06:55
4574 % 2 = 4 %2
457 % 2 = 7%2
45 % 2 = 5%2
Смысл я надеюсь понятен?
0