Это мое решение в java
public class Main {
public static void main(String[] args) {
int m = 3;
int n = 36;
int counter = 0;
float ntemp;
if (m > n) {
counter = m - n;
System.out.println("result: " + counter);
return;
}
while (m != n) {
ntemp = n;
while (m < ntemp) {
ntemp = ntemp / 2;
}
if (m < ntemp + 1) {
m = m * 2;
System.out.println("*2");
} else {
m = m - 1;
System.out.println("-1");
}
counter++;
}
System.out.println("result: " + counter);
}
}
Объяснение:
Ниже я рассматриваю только случаи, где m = n очевиден.
1.Если 2m> n
В этом случае
a) если 2 (m-1) = n -> end
b) если 2 (m-1))
После вычитания 1 получим слишком маленькое число.
Мы можем преобразовать неравенство:
2 (м-1) м
Если у нас слишком маленькое число, мы должны умножить на 2, но это было бы неоптимально, потому что мы должны вычесть 2 * (m-1) раз (или2 * (m-2) -1, если n нечетное число), так что это означает, что вычитать 1 не очень хорошая идея.
Суммирование: Для m умножить, а затемвычесть
2.Если 2m n
После некоторых операций (одно умножение и некоторое количество -1) мы хотим получить условие выполнения результата с шага 1 .: m
Мы предположили, что 4m> n -> 2 * 2 * m> n -> 2m> n / 2.
Когда мы меняем обозначение n / 2= ntemp, мы получаем то же условие:
2m> ntemp, поэтому мы можем получить те же выводы, что и на шаге 1.
3.Если x * m n, x-iteger
Каждое число m можно преобразовать аналогично шагу 2. и получить те же выводы.
PS: я знаю, что это не формальное доказательство, и извините за мой английский :) 1048 *