Определите, какое наименьшее число операций необходимо, чтобы получить из числа 1 число N - Turbo Pascal

Узнай цену своей работы

Формулировка задачи:

Имеется калькулятор, который выполняет три операции: 1. Прибавить к числу X единицу. 2. Умножить число X на 2. 3. Умножить число X на 3. Определите, какое наименьшее число операций необходимо для того, чтобы получить из числа 1 заданное число N. Также вывести последовательность операций, например 1,2,3. Входные данные: Число N, не превосходящее 106. Выходные данные: Наименьшее количество искомых операций.

Решение задачи: «Определите, какое наименьшее число операций необходимо, чтобы получить из числа 1 число N»

textual
Листинг программы
var n , i , am : longint;
    a , res : array[1..1000000] of longint;
 
begin
    read(n);
    a[1] := 0;
    for i := 2 to n do
        a[i] := maxint;
    for i := 2 to n do begin
        if a[i] > a[i - 1] + 1 then
            a[i] := a[i - 1] + 1;
        if i mod 2 = 0 then
            if a[i] > a[i div 2] + 1 then
                a[i] := a[i div 2] + 1;
        if i mod 3 = 0 then
            if a[i] > a[i div 3] + 1 then
                a[i] := a[i div 3] + 1;
    end;    
    writeln(a[n]);
    am := 0;
    i := n;
    while i <> 1 do begin
        inc(am);
        if (i mod 3 = 0) and (a[i div 3] + 1 = a[i]) then begin
                res[am] := 3;
                i := i div 3;
        end else if (i mod 2 = 0) and (a[i div 2] + 1 = a[i]) then begin
                res[am] := 2;
                i := i div 2;
        end else begin
            res[am] := 1;
            i := i - 1;
        end;                        
    end;
    for i := am downto 1 do
        writeln(res[i]);
end.

Объяснение кода листинга программы

  1. Переменные n, i, am объявлены как longint.
  2. Создается массив a[1..1000000] of longint, где каждый элемент массива инициализируется значением максимальной возможной целочисленной величины.
  3. Число n считывается с помощью функции read.
  4. Первый элемент массива a[1] устанавливается равным 0.
  5. Для i от 2 до n выполняется цикл for.
  6. Внутри цикла проверяется, больше ли значение a[i] значения a[i-1] + 1. Если это условие истинно, то значение a[i] устанавливается равным a[i-1] + 1.
  7. Если i делится на 2 без остатка, то проверяется, больше ли значение a[i] значения a[i/2] + 1. Если это условие истинно, то значение a[i] устанавливается равным a[i/2] + 1.
  8. Если i делится на 3 без остатка, то проверяется, больше ли значение a[i] значения a[i/3] + 1. Если это условие истинно, то значение a[i] устанавливается равным a[i/3] + 1.
  9. После завершения цикла for, значение a[n] равно 1.
  10. Переменная am инициализируется значением 0.
  11. Цикл while начинается.
  12. Для i от n до 1 выполняется цикл while.
  13. Внутри цикла выполняется проверка: если i делится на 3 без остатка и значение a[i/3] + 1 равно a[i], то значение res[am] устанавливается равным 3, i устанавливается равным i/3, и цикл while завершается.
  14. Если i делится на 2 без остатка и значение a[i/2] + 1 равно a[i], то значение res[am] устанавливается равным 2, i устанавливается равным i/2, и цикл while завершается.
  15. Если i не делится на 3 или 2 без остатка, то значение res[am] устанавливается равным 1, i устанавливается равным i - 1, и цикл while завершается.
  16. После завершения цикла while, значение res[am] содержит результат вычисления.
  17. Для i от am до 1 выполняется цикл for.
  18. Внутри цикла выполняется проверка: если i равно am, то значение res[i] устанавливается равным 0, и цикл for завершается.
  19. Если i меньше am, то значение res[i] устанавливается равным значению res[i+1].
  20. Код завершается.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4 из 5
Похожие ответы