Главная страница

Ответы на задачи 24 (С1)


Скачать 1.92 Mb.
НазваниеОтветы на задачи 24 (С1)
Дата26.03.2018
Размер1.92 Mb.
Формат файлаdoc
Имя файлаansw24-C1.doc
ТипПрограмма
#39513
страница17 из 18
1   ...   10   11   12   13   14   15   16   17   18

t := 1;

Это первая ошибка в программе. Она всегда увеличивает значение k на 1.

Перебор значений k начинается с 1 и продолжается пока выполняется условие K3 <= N. Внутри цикла проверяется нижняя граница:

if k*k*k > m then t := t + 1;

но это неравенство строгое, а нам задано нестрогое неравенство. Это вторая ошибка. Уменьшает значение k на 1 (в сравнении с правильным) для тех случаев, когда M – это куб какого-то целого числа. Что произойдет при вводе чисел 10 и 100? Между ними находятся кубы двух чисел: 27 = 33 и 64 = 43. Кроме того, переменная t будет увеличена на 1 из-за неправильной инициализации. Число 10 – это не точный куб, поэтому уменьшения значения t в результате второй ошибки не будет. Программа выдаст число 3.

Две ошибки скомпенсируются и программа выдаст правильный ответ, если M – точный куб какого-то целого числа. Например, 1, 8, 27 и т.д.

  1. при вводе чисел 10 и 100 программа выведет число 3.

  2. при вводе чисел 1 и 10 программа выведет верный ответ 2.

  3. в программе нужно исправить две ошибки

    1. Неверное начальное значение t:

Было: t:=1;

Исправление: t:=0;

    1. Неверное условие:

Было: if k*k*k > m then

Исправление: if k*k*k >= m then

  1. Эта задача полностью аналогична задаче 66, поэтому приведём только ответы на вопросы:

  1. при вводе чисел 10 и 40 программа выведет число 4.

  2. при вводе чисел 1 и 16 программа выведет верный ответ 4.

  3. в программе нужно исправить две ошибки

    1. Неверное начальное значение t:

Было: t:=1;

Исправление: t:=0;

    1. Неверное условие:

Было: while k*k < n do begin

Исправление: while k*k <= n do begin

  1. Для того чтобы выполнить первое задание, используем трассировку (ручную прокрутку):




условие верно?

n

k







25




k := 0;







0

k mod 5 = 0?

да







k := k + 1;







1

n := n div 5;




5




k mod 5 = 0?

нет







k = 1?

да







Поскольку после завершения цикла k=1, то

  1. для входного числа n=25 будет выведено значение 1.

Для ответа на второй вопрос обратим внимание, что конечное значение переменной k никак не зависит от n, и программа ВСЕГДА будет выводить результат 1. Поэтому

  1. программа работает правильно только при n=51=5.

Чтобы исправить программу, нужно понять алгоритм её работы, как задумывал автор (но не реализовал). Очевидно, что k – это счётчик, с помощью которого мы считаем степень числа 5. Оператор

n := n div 5;

говорит о том, что предполагалось делить исходное число на 5 до тех пор, пока оно делится, и считать, сколько раз нам удалось разделить его на 5 без остатка. Поэтому условие работы цикла должно быть записано как «пока n делится на 5», то есть

while n mod 5 = 0 do begin

...

end;

Одна ошибка найдена.

Если введённое число – это степень числа 5, то оно будет делиться на 5 до тех пор, пока в переменной n не останется 1. Таким образом, условие «число представляет собой натуральную степень числа 5» после цикла запишется в виде

if n = 1 then

...

Это вторая ошибка. Итак, ответ на третий вопрос таков:

  1. в программе нужно исправить две ошибки

    1. Неверное условие цикла:

Было: while k mod 5 = 0 do begin

Исправление: while n mod 5 = 0 do begin

    1. Неверное условие в условном операторе:

Было: if k = 1 then

Исправление: if n = 1 then

  1. Эта задача аналогична предыдущей, поэтому приведём только окончательные ответы:

  1. для входного числа n=49 будет выведено значение 8.

2) программа работает правильно при n=71=7 (выводит 1).

3) в программе нужно исправить две ошибки

  1. Неверное изменение счётчика k:

Было: k := k + n div 7;

Исправление: k := k + 1;

  1. Неверное условие при выводе ответа:

Было: if n <= 7 then

Исправление: if n = 1 then

  1. Эта задача аналогична задаче 68, поэтому приведём только окончательные ответы:

1) для входного числа n=16 будет выведено «не существует».

2) программа работает правильно при n=41=4 (выводит 1).

3) в программе нужно исправить две ошибки

  1. Неверное изменение счётчика k:

Было: k := k + n div 4;

Исправление: k := k + 1;

  1. Неверное условие при выводе ответа:

Было: if k = 1 then

Исправление: if n = 1 then

  1. Эта задача аналогична задаче 69, поэтому приведём только окончательные ответы:

  1. для входного числа n=9 будет выведено значение 1.

2) программа работает правильно при n=31=3 (выводит 1) или n=2 (выводит «Не существует»).

3) в программе нужно исправить две ошибки

  1. Неверное условие цикла::

Было: while k mod 3 = 0 do begin

Исправление: while n mod 3 = 0 do begin

  1. Неверное условие при выводе ответа:

Было: if n > 0 then

Исправление: if n = 1 then

  1. С помощью ручной трассировки убеждаемся, что при вводе числа 11 программа выдаёт ответ 3:




s

k

A

read(A)







11

s := 0

0







k := -1




-1




s < A  да










k := k + 1




0




s := s + k*k

0







s < A  да










k := k + 1




1




s := s + k*k

1







s < A  да










k := k + 1




2




s := s + k*k

5







s < A  да










k := k + 1




3




s := s + k*k

14







s < A  нет










  1. для входного числа n=11 будет выведено значение 3.

В ходе трассировки мы увидели проблему: переменная k изменяется с шагом 1 (а не 2!) и проходит как чётные, так и нечётные числа. Кроме того, цикл заканчивается тогда, когда s равно A (потому что нарушается условие s < A), а должен заканчиваться только при s > A. Отсюда сразу следует ответ на третий вопрос:

3) в программе нужно исправить две ошибки

  1. Неверное изменение переменной k:

Было: k := k + 1;

Исправление: k := k + 2;

  1. Неверное условие цикла:

Было: while s < A do begin

Исправление: while s <= A do begin

Остается ответить на второй вопрос: при каком наименьшем A программа выдает правильный ответ. Построим таблицы изменения переменных s и k для неправильной программы:

k

1

2

3

4

s

1

5

14

30

Поскольку цикл завершается при s  a, при A = 1 программа выдаёт ответ 1, при 2  A  5 – ответ 2, при 6  A  15 – ответ 3 и т.д.

Для правильного решения:

k

1

3

5

s

1

10

35

Мы должны получить при 1  A  9 – ответ 3, при 10  A  34 – ответ 5 и т.д. Отсюда следует, что программа выдаёт верный ответ 3 при 6  A  9, минимальное из этих значений – 6.

2) минимальное значение А, при котором программа работает правильно, равно 6.

  1. С помощью ручной трассировки убеждаемся, что при вводе числа 11 программа выдаёт ответ 4:




s

k

A

read(A)







11

s := 0

0







k := 1




1




s <= A  да










s := s + k*k

1







k := k + 1




2




s <= A  да










s := s + k*k

5







k := k + 1




3




s <= A  да










s := s + k*k

14







k := k + 1




4




s <= A  нет










1) для входного числа n=11 будет выведено значение 4.

В ходе трассировки мы увидели проблему: переменная k изменяется с шагом 1 (а не 2!) и проходит как чётные, так и нечётные числа. Кроме того, переменная k увеличивается после того, как изменилась переменная s, поэтому программа выводит следующее значение k, которое уже не учитывалось в сумме. Отсюда сразу следует ответ на третий вопрос:

3) в программе нужно исправить две ошибки

  1. Неверное изменение переменной k:

Было: k := k + 1;

Исправление: k := k + 2;

  1. Неверный вывод результата:

Было: writeln(k);

Исправление: writeln(k-2); {вернуться на шаг назад}

Остается ответить на второй вопрос: при каком наименьшем A программа выдает правильный ответ. Построим таблицы изменения переменных s и k для неправильной программы:

k

1

2

3

4

s

1

5

14

30

Поскольку программа выводит следующее значение k, при 1  A  4 она выдаёт ответ 3, при 5  A  13 – ответ 4 и т.д.

Для правильного решения:

k

1

3

5

s

1

10

35

Мы должны получить при 1  A  9 – ответ 3, при 10  A  34 – ответ 5 и т.д. Отсюда следует, что программа выдаёт верный ответ 3 при 1  A  4, минимальное из этих значений – 1.

2) минимальное значение А, при котором программа работает правильно, равно 1.

  1. С помощью ручной трассировки убеждаемся, что при вводе числа 12 программа выдаёт ответ 5.




p

s

k

A

read(A)










12

s := 0




0







p := 0

0










k := 1







1




s < A  да













p := p + k

1










s := s + p




1







k := k + 1







2




s < A  да













p := p + k

3










s := s + p




4







k := k + 1







3




s < A  да













p := p + k

6










s := s + p




10







k := k + 1







4




s < A  да













p := p + k

10










s := s + p




20







k := k + 1







5




s < A  нет













1) при вводе числа
1   ...   10   11   12   13   14   15   16   17   18


написать администратору сайта