Ответы на задачи 24 (С1)
Скачать 1.92 Mb.
|
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 и т.д.
Было: t:=1; Исправление: t:=0;
Было: if k*k*k > m then Исправление: if k*k*k >= m then
Было: t:=1; Исправление: t:=0;
Было: while k*k < n do begin Исправление: while k*k <= n do begin
Поскольку после завершения цикла k=1, то
Для ответа на второй вопрос обратим внимание, что конечное значение переменной k никак не зависит от n, и программа ВСЕГДА будет выводить результат 1. Поэтому
Чтобы исправить программу, нужно понять алгоритм её работы, как задумывал автор (но не реализовал). Очевидно, что 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 ... Это вторая ошибка. Итак, ответ на третий вопрос таков:
Было: while k mod 5 = 0 do begin Исправление: while n mod 5 = 0 do begin
Было: if k = 1 then Исправление: if n = 1 then
2) программа работает правильно при n=71=7 (выводит 1). 3) в программе нужно исправить две ошибки
Было: k := k + n div 7; Исправление: k := k + 1;
Было: if n <= 7 then Исправление: if n = 1 then
1) для входного числа n=16 будет выведено «не существует». 2) программа работает правильно при n=41=4 (выводит 1). 3) в программе нужно исправить две ошибки
Было: k := k + n div 4; Исправление: k := k + 1;
Было: if k = 1 then Исправление: if n = 1 then
2) программа работает правильно при n=31=3 (выводит 1) или n=2 (выводит «Не существует»). 3) в программе нужно исправить две ошибки
Было: while k mod 3 = 0 do begin Исправление: while n mod 3 = 0 do begin
Было: if n > 0 then Исправление: if n = 1 then
В ходе трассировки мы увидели проблему: переменная k изменяется с шагом 1 (а не 2!) и проходит как чётные, так и нечётные числа. Кроме того, цикл заканчивается тогда, когда s равно A (потому что нарушается условие s < A), а должен заканчиваться только при s > A. Отсюда сразу следует ответ на третий вопрос: 3) в программе нужно исправить две ошибки
Было: k := k + 1; Исправление: k := k + 2;
Было: while s < A do begin Исправление: while s <= A do begin Остается ответить на второй вопрос: при каком наименьшем A программа выдает правильный ответ. Построим таблицы изменения переменных s и k для неправильной программы:
Поскольку цикл завершается при s a, при A = 1 программа выдаёт ответ 1, при 2 A 5 – ответ 2, при 6 A 15 – ответ 3 и т.д. Для правильного решения:
Мы должны получить при 1 A 9 – ответ 3, при 10 A 34 – ответ 5 и т.д. Отсюда следует, что программа выдаёт верный ответ 3 при 6 A 9, минимальное из этих значений – 6. 2) минимальное значение А, при котором программа работает правильно, равно 6.
1) для входного числа n=11 будет выведено значение 4. В ходе трассировки мы увидели проблему: переменная k изменяется с шагом 1 (а не 2!) и проходит как чётные, так и нечётные числа. Кроме того, переменная k увеличивается после того, как изменилась переменная s, поэтому программа выводит следующее значение k, которое уже не учитывалось в сумме. Отсюда сразу следует ответ на третий вопрос: 3) в программе нужно исправить две ошибки
Было: k := k + 1; Исправление: k := k + 2;
Было: writeln(k); Исправление: writeln(k-2); {вернуться на шаг назад} Остается ответить на второй вопрос: при каком наименьшем A программа выдает правильный ответ. Построим таблицы изменения переменных s и k для неправильной программы:
Поскольку программа выводит следующее значение k, при 1 A 4 она выдаёт ответ 3, при 5 A 13 – ответ 4 и т.д. Для правильного решения:
Мы должны получить при 1 A 9 – ответ 3, при 10 A 34 – ответ 5 и т.д. Отсюда следует, что программа выдаёт верный ответ 3 при 1 A 4, минимальное из этих значений – 1. 2) минимальное значение А, при котором программа работает правильно, равно 1.
1) при вводе числа |