Учитывая число A, найдите наименьшее число B, такое, что A * B содержит только цифры 4 и 0, а нули должны быть только в конце, т.е. числа, подобные 404, недействительны.
Например:
| A | B | A*B |
|---|-----|-----|
| 1 | 4 | 4 |
| 2 | 2 | 4 |
| 3 | 148 | 444 |
| 4 | 1 | 4 |
| 5 | 8 | 40 |
Ну, я поставил вопрос таким образом. Ведение очереди целых чисел. Наименьшее возможное число - 4.
Pop the number (i.e. the front element of the queue) and push the numbers that can be derived from this popped number.
That is , when we pop 4, we push (4*10) = 40 and (4*10 + 4) = 44 with the constraint that the popped number is not divisible by 10. If it is, push only its next multiple of 10.
Итак, моя очередь будет выглядеть так: 4,40,44,400,440,444,....
По мере того, как я вывожу элементы из очереди, я проверю, делится ли оно заданным номером A. Если да, просто сломайте, и число всплыло, это мой желаемый результат.
Поскольку мой номер может быть действительно большим, я поддерживал очередь pair<string,int>
, где строка соответствует number
, а int соответствует remainder
. Таким образом, остаток следующей стадии может быть легко вычислен.
Пример:
queue : <"4",4>
Pop , current result is string : "4" and remainder is lets say prev = 4
check if the last digit is 0 or not (for checking if its a multiple of 10 or not)
If not, then append 0 to this string and remainder as (prev*10)%a and push this pair in the queue. Also, append 4 to this string with remainder as : (prev*10 +4)%a and push. If the last digits is 0, append 0(not 4) and corresponding remainder, push this pair in the queue.
Queue: <"40",(prev*10)%a>, <"44", (prev*10 +4)%a> and so on..
Пока пара в передней части очереди не останется 0, мы продолжим делать это.
Хотя это улучшение показалось немного хорошим, но не правильным и не прошло все тестовые примеры. Может кто-то, пожалуйста, рассказать о том, как это нужно решить оптимальным образом. (Диапазон А равен 10 ^ 10).