Это довольно легко понять, если вы знаете модульную арифметику, выражение (b[n] + 10 * b[n - 1] + ... + 10^k * b[k] + ... + 10^n * b[0]) modulo a
, которое является технически исходным оператором проблемы, может быть упрощено до (...((b[0] modulo a) * 10 + b[1]) modulo a) * 10 + ... + b[n]) modulo a
, что и делает ваш алгоритм.
Чтобы доказать, что их равно мы можем вычислить коэффициент по модулю a
перед тем b[i]
во втором выражении, легко видеть, что для b[i]
будет ровно n - i
раз мы должны умножить его на 10 (последний, который n
будет умножен 0 раз, один до него 1 раз и т. Д.). Таким образом, по модулю a
он равен 10^(n - i)
, который является таким же коэффициентом до b[i]
в первом выражении.
Таким образом, поскольку все коэффициенты перед b[i]
в обоих выражениях будут равны, то очевидно, что оба выражения равны по модулю (k_0 * b[0] + k_1 * b[1] ... + k_n * b[n])
a
и, таким образом, они равны по модулю a
.
48
- это код для 0
цифр, поэтому (b[i] - 48)
- это преобразование с символа на цифру.
только магическое число здесь 48. ASCII-код символа «0». Итак '' 0 "- 48 == 0;' и '" 1 "- 48 == 1;' и так далее. Остальная часть кода вам понять. – teivaz
@MarkGraph ваш сарказм лучше, чем ваши предположения. – daft300punk
Кусок кода, который вы «нашли», не принимает «два целых числа, a и b», так что это не очень хорошее начало. –