Анализ программы с циклами и условными операторами. Анализ программы с циклами и условными операторами Алгоритмы,печатающие числа,наибольшее значение видимого числа
Скачать 52.61 Kb.
|
Анализ программы с циклами и условными операторами Алгоритмы,печатающие числа,наибольшее значение видимого числа №1. Ниже записана программа. Получив на вход число x , эта программа печатает два числа, L и M. Укажите наибольшее из таких чисел x, при вводе которых алгоритм печатает сначала 3, а потом 7. var x, L, M: integer; begin readln(x); L:=0; M:=0; while x > 0 do begin L:= L + 1; if x mod 2 = 0 then M:= M + (x mod 10) div 2; x:= x div 10; end; writeln(L); write(M); end. Пояснение. Рассмотрим цикл, число шагов которого зависит от изменения переменной x: while x > 0 do begin ... x:= x div 10; end; Т. к. оператор div оставляет только целую часть от деления, то при делении на 10 это равносильно отсечению последней цифры. Из приведенного цикла видно, что на каждом шаге от десятичной записи x отсекается последняя цифра до тех пор, пока все цифры не будут отсечены, то есть x не станет равно 0; поэтому цикл выполняется столько раз, сколько цифр в десятичной записи введенного числа, при этом число L столько же раз увеличивается на 1. Следовательно, конечное значение L совпадает с числом цифр в x. Для того, чтобы L стало L=3, x должно быть трёхзначным. Теперь рассмотрим оператор изменения M: if x mod 2 = 0 then M:= M + (x mod 10) div 2; end; Оператор mod оставляет только остаток от деления, при делении на 10 это последняя цифра x. Условие x mod 2 = 0 означает следующее: чтобы M увеличилось, число x должно быть чётным. Предположим, исходное x нечётное, тогда на первом шаге M = 0. Если на втором шаге x также нечётное (вторая цифра исходного числа нечётная), то M = 0, причём каким бы ни было значение x на третьем шаге, мы не сможем получить M = 7, поскольку остаток от деления чётного числа на 10 не превосходит 8, а 8 / 2 = 4, следовательно, вторая цифра исходного x чётная. Тогда первая цифра может принимать значения 2, 4, 6, 8, но мы ищем наибольшее x, поэтому сделаем первую цифру, равной 9, тогда наше предположение не удовлетворяет условию задачи, и последняя цифра исходного числа обязана быть чётной, т.е. исходное x чётно. 7 = 4 + 3, чему соответствуют цифры 8 и 6. Теперь, располагая цифры по убыванию, находим наибольшее возможное x: x = 986. Ответ: 986. №2. Ниже на пяти языках программирования записан алгоритм. Получив на вход число x, этот алгоритм печатает числа: a и b. Укажите наибольшее четырехзначное число x, при вводе которого алгоритм печатает сначала 5, а потом 7.
Пояснение. Рассмотрим цикл, число шагов которого зависит от изменения переменной x: while x > 0 do begin y := x mod 10; x:= x div 10; ... end; Т. к. оператор div возвращает целую часть от деления, то при делении на 10 это равносильно отсечению последней цифры. Следовательно, цикл выполнится четыре раза. В переменную a записывается остаток от деления числа x на 10 при условии, что этот остаток меньше числа уже записанного в переменной a. В переменную b записывается остаток от деления числа x на 10 при условии, что этот остаток больше числа уже записанного в переменной b. Таким образом, в переменную a записывается наибольшая цифра числа x, а в переменную b — наименьшая. Значит, наибольшее число, удовлетворяющее условию задчи — 7775. Ответ: 7775. №3. Ниже на пяти языках записан алгоритм. Получив на вход число x, этот алгоритм печатает два числа a и b. Укажите наименьшее из таких чисел x, при вводе которого алгоритм печатает сначала 2, а потом 7.
Пояснение. Рассмотрим цикл, число шагов которого зависит от изменения переменной x: while x > 0 do begin ... x:= x div 100; end; Т. к. оператор div возвращает целую часть от деления, то при делении на 100 это равносильно отсечению последних двух цифр. На каждом шаге от десятичной записи x отсекается две последних цифры до тех пор, пока все цифры не будут отсечены, то есть x не станет равно 0. Для того, чтобы a стало равным 2, x должно быть трёхзначным или четырёхзначным. Теперь рассмотрим изменение b: while x>0 do begin b:=b*(x mod 100); end; Оператор mod возвращает остаток от деления, при делении на 100 это последние две цифры x. Следовательно, последняя цифра числа должна быть 7, а во втором разряде должен быть либо ноль либо единица, а в первом — единица. Искомое число — 107. Ответ: 107. №4. Ниже записана программа. Получив на вход число x , эта программа печатает два числа, L и M. Укажите наибольшее из таких чисел x, при вводе которых алгоритм печатает сначала 3, а потом 10. var x, L, M: integer; begin readln(x); L:=0; M:=0; while x > 0 do begin L:=L+1; if M < x then begin M:= (x mod 10) * 2; end; x:= x div 10; end; writeln(L); write(M); end. Пояснение. Рассмотрим цикл, число шагов которого зависит от изменения переменной x: while x > 0 do begin ... x:= x div 10; end; Т. к. оператор div оставляет только целую часть от деления, то при делении на 10 это равносильно отсечению последней цифры. Из приведенного цикла видно, что на каждом шаге от десятичной записи x отсекается последняя цифра до тех пор, пока все цифры не будут отсечены, то есть x не станет равно 0; поэтому цикл выполняется столько раз, сколько цифр в десятичной записи введенного числа, при этом число L столько же раз увеличивается на 1. Следовательно, конечное значение L совпадает с числом цифр в x. Для того, чтобы L стало L=3, x должно быть трёхзначным. Теперь рассмотрим оператор изменения M: if M < x then begin M:= (x mod 10) * 2; end; Оператор mod оставляет только остаток от деления, при делении на 10 это последняя цифра x. Чтобы M приняло значение M = 10 в числе x должно присутствовать цифра 5. Т. к. мы ищем наибольшее x, сделаем первую цифру исходного числа, равной 9, при этом если вторая цифра 5, тогда на третьем шаге условие M < x не выполняется (10>9), и на экране мы получим нужное нам число. Осталось определить последнюю цифру исходного числа x. После первого шага x = 95, но максимальный остаток от деления на 10 равен 9, следовательно, M после первого шага не может превысить 9 * 2 = 18, а 18 < 95, значит будет выполняться нужный нам второй шаг. Искомое число 959. Ответ: 959. №5. Ниже записана программа. Получив на вход число x , эта программа печатает два числа, a и b. Укажите наибольшее из таких чисел x, при вводе которых алгоритм печатает сначала 3, а потом 0. var x, a, b : integer; begin readln(x); a := 0; b := 1; while x > 0 do begin a := a + 1; b := b * (x mod 10); x := x div 10; end; writeln(a); write(b); end. Пояснение. Рассмотрим цикл, число шагов которого зависит от изменения переменной x: while x > 0 do begin ... x:= x div 10; end; Т. к. оператор div оставляет только целую часть от деления, то при делении на 10 это равносильно отсечению последней цифры. Из приведенного цикла видно, что на каждом шаге от десятичной записи x отсекается последняя цифра до тех пор, пока все цифры не будут отсечены, то есть x не станет равно 0; поэтому цикл выполняется столько раз, сколько цифр в десятичной записи введенного числа, при этом число a столько же раз увеличивается на 1. Следовательно, конечное значение a совпадает с числом цифр в x. Для того, чтобы a стало a = 3, x должно быть трёхзначным. Теперь рассмотрим оператор изменения b: while x>0 do begin b:=b*(x mod 10); end; Оператор mod оставляет только остаток от деления, при делении на 10 это последняя цифра x; следовательно, число b получается произведением цифр числа x. Если b = x(1) * x(2) * x(3) = 0, где число в скобках означает номер цифры в числе x, то хотя бы один из множителей равен нулю, но это означает, что на каком-то шаге x нацело делится на 10. Если это происходит на первом шаге, тоx(1) и x(2) могут быть любыми однозначными числами. Т. к. мы хотим получить наибольшее число, то x = 990. Ответ: 990. №6. Ниже записана программа. Получив на вход число x , эта программа печатает два числа, L и M. Укажите наибольшее из таких чисел x, при вводе которых алгоритм печатает сначала 3, а потом 7. var x, L, M: integer; begin readln(x); L:=0; M:=0; while x > 0 do begin L:=L+1; if M < x then begin M:=x mod 10; end; x:= x div 10; end; writeln(L); write(M); end. Пояснение. Рассмотрим цикл, число шагов которого зависит от изменения переменной x: while x > 0 do begin ... x:= x div 10; end; Т. к. оператор div оставляет только целую часть от деления, то при делении на 10 это равносильно отсечению последней цифры. Из приведенного цикла видно, что на каждом шаге от десятичной записи x отсекается последняя цифра до тех пор, пока все цифры не будут отсечены, то есть x не станет равно 0; поэтому цикл выполняется столько раз, сколько цифр в десятичной записи введенного числа, при этом число L столько же раз увеличивается на 1. Следовательно, конечное значение L совпадает с числом цифр в x. Для того, чтобы L стало L = 3, x должно быть трёхзначным. Теперь рассмотрим оператор изменения М: if M < x then begin M:=x mod 10; end; Оператор mod оставляет только остаток от деления, при делении на 10 это последняя цифра. После первого шага M может быть любым однозначным числом, т. к. на втором шаге число x двузначное, а однозначное число всегда меньше любого двузначного, а значит, M может приобрести интересующее нас значение 7. Поэтому третья цифра числа x x(3) = 9. Вторая цифра уже не может быть любой, так как при x(2) > x(1) значение переменной M уже не поменяется на третьем шаге. Поэтому x(2) не превышает 7. Поскольку мы хотим получить наибольшее число x, мы берём x(1) = 7. Осталось верно определить x(2). Число x достигнет максимума при x(2)=7, при этом на третьем шаге переменная M уже не изменится, потому что нарушено условие M < x (7 = 7). Окончательно получаем: x = 779. Ответ: 779. №7а числа, a и b. Укажите наибольшее из таких чисел x, при вводе которых алгоритм печатает сначала 3, а потом 7. var x, a, b : integer; begin readln(x); a := 0; b := 1; while x > 0 do begin a := a + 1; b := b * (x mod 10); x := x div 10; end; writeln(a); write(b); end. Пояснение. Рассмотрим цикл, число шагов которого зависит от изменения переменной x: while x > 0 do begin ... x:= x div 10; end; Т. к. оператор div оставляет только целую часть от деления, то при делении на 10 это равносильно отсечению последней цифры. Из приведенного цикла видно, что на каждом шаге от десятичной записи x отсекается последняя цифра до тех пор, пока все цифры не будут отсечены, то есть x не станет равно 0; поэтому цикл выполняется столько раз, сколько цифр в десятичной записи введенного числа, при этом число a столько же раз увеличивается на 1. Следовательно, конечное значение a совпадает с числом цифр в x. Для того, чтобы a стало a = 3, x должно быть трёхзначным. Теперь рассмотрим оператор изменения b: while x>0 do begin b:=b*(x mod 10); end; Оператор mod оставляет только остаток от деления, при делении на 10 это последняя цифра x; следовательно, число b получается произведением цифр числа x. b = x(1) * x(2) * x(3) = 7, где число в скобках означает номер цифры в числе x. Число 7 простое, поэтому 7 = 7 * 1 * 1. Составляем максимальное число: 711 Ответ: 711. №8. Ниже записана программа. Получив на вход число x , эта программа печатает два числа, L и M. Укажите наибольшее из таких чисел x, при вводе которых алгоритм печатает сначала 3, а потом 7. var x, L, M: integer; begin readln(x); L:=0; M:=0; while x > 0 do begin L:= L + 1; if x mod 2 = 0 then M:= M + (x mod 10) div 2; x:= x div 10; end; writeln(L); write(M); end. Пояснение. Напомним: X div a - целая часть от деления числа X на a, X mod a - остаток от деления числа X на a. Пока X больше нуля выполняется увеличение L на единицу. Если X четное (остаток от деления на 2 равен 0), то M увеличивается на половину цифры, стоящей в единицах числа X, X сокращается на один разряд справа. L - количество цифр в числе X, M - сумма, которая находится таким образом: L=3, следовательно X = a * 100 + b * 10 + c, M = (a + b + c) / 2, если все числа четны. Если хоть одно из чисел нечетное, то сумма будет состоять из 2-х цифр, так как при М = 7, a + b + c = 14, т. е. нужны как минимум 2 цифры чтобы набрать данную сумму. Чтобы подобрать максимальное число примем, что a = 9, b + c = 14, и обе цифры четные, так что b = 8 — наибольшая четная цифра, c = 6. Правильный ответ: 986. №9. Ниже записана программа. Получив на вход число x , эта программа печатает два числа, L и M. Укажите наибольшее из таких чисел x, при вводе которых алгоритм печатает сначала 3, а потом 7. var x, L, M: integer; begin readln(x); L:=0; M:=0; while x > 0 do begin L:= L + 1; M:= M + x mod 10; x:= x div 10; end; writeln(L); write(M); end. Пояснение. Рассмотрим цикл, число шагов которого зависит от изменения переменной x: while x > 0 do begin ... x:= x div 10; end; Т. к. оператор div оставляет только целую часть от деления, то при делении на 10 это равносильно отсечению последней цифры. Из приведенного цикла видно, что на каждом шаге от десятичной записи x отсекается последняя цифра до тех пор, пока все цифры не будут отсечены, то есть x не станет равно 0; поэтому цикл выполняется столько раз, сколько цифр в десятичной записи введенного числа, при этом число L столько же раз увеличивается на 1. Следовательно, конечное значение L совпадает с числом цифр в x. Для того, чтобы L стало L=3, x должно быть трёхзначным. Теперь рассмотрим оператор изменения M: M:= M + x mod 10; end; Оператор mod оставляет только остаток от деления, при делении на 10 это последняя цифра x. Таким образом М есть сумма цифр числа x. Представим 7 в виде суммы: 7 = 7 + 0 + 0 = 1 + 6 + 0 = 1 + 5 + 1 = 1 + 4 + 2 = 1 + 3 + 3 и т. д. Видно, что мы не можем использовать цифры больше 7, поэтому для получения максимального числа используем представление 7 = 7 + 0 + 0. Из этих цифр составим наибольшее число: 700. Ответ: 700. №10. Ниже записана программа. Получив на вход число x , эта программа печатает два числа, L и M. Укажите наибольшее из таких чисел x, при вводе которых алгоритм печатает сначала 3, а потом 10. var x, L, M: integer; begin readln(x); L:=0; M:=0; while x > 0 do begin L:=L+1; if (M < x) and (x mod 2 = 1) then begin M:= (x mod 10) * 2; end; x:= x div 10; end; writeln(L); write(M); end. Пояснение. Рассмотрим цикл, число шагов которого зависит от изменения переменной x: while x > 0 do begin ... x:= x div 10; end; Т. к. оператор div оставляет только целую часть от деления, то при делении на 10 это равносильно отсечению последней цифры. Из приведенного цикла видно, что на каждом шаге от десятичной записи x отсекается последняя цифра до тех пор, пока все цифры не будут отсечены, то есть x не станет равно 0; поэтому цикл выполняется столько раз, сколько цифр в десятичной записи введенного числа, при этом число L столько же раз увеличивается на 1. Следовательно, конечное значение L совпадает с числом цифр в x. Для того, чтобы L стало L=3, x должно быть трёхзначным. Теперь рассмотрим оператор изменения M: if (M < x) and (x mod 2 = 1) then begin M:= (x mod 10) * 2; end; Оператор mod оставляет только остаток от деления, при делении на 10 это последняя цифра x. Чтобы получить M = 10, в числе x должна быть цифра 5. Это можно сделать уже на первом шаге. На втором шаге число x уже двузначное, и поскольку мы ищем максимальное число, то условие M < x будет выполняться. Однако, мы можем нарушить условие нечётности (x mod 2 = 1), если сделаем вторую цифру чётной, тогда M далее не изменится, потому что на третьем шаге останется только первая цифра числа x, а любое однозначное число меньше любго двузначного, включая 10. Поэтому первая цифра может быть любой, положим её равной 9, вторая цифра должна быть чётной — выбираем наибольшую, т. е. 8. В результате получаем число 985. Ответ: 985. Алгоритмы,печатающие числа,наименьшее значение видимого числа №1. Ниже на пяти языках записан алгоритм. Получив на вход число x, этот алгоритм печатает два числа a и b. Укажите наименьшее из таких чисел x, при вводе которого алгоритм печатает сначала 2, а потом 13.
Пояснение. Рассмотрим цикл, число шагов которого зависит от изменения переменной x: while x > 0 do begin ... x:= x div 100; end; Т. к. оператор div возвращает целую часть от деления, то при делении на 100 это равносильно отсечению последних двух цифр. На каждом шаге от десятичной записи x отсекается две последних цифры до тех пор, пока все цифры не будут отсечены, то есть x не станет равно 0. Для того, чтобы a стало равным 2, x должно быть трёхзначным или четырёхзначным. Теперь рассмотрим изменение b: while x>0 do begin b:=b+(x mod 100); end; Оператор mod возвращает остаток от деления, при делении на 100 это последние две цифры x. Разобьём 13 на два слагаемых так, чтобы можно было составить трёхзначное число: 13 = 1 +12. Искомое число — 112. Ответ: 112. №2. Ниже на пяти языках программирования записан алгоритм. Получив на вход число x, этот алгоритм печатает числа: a и b. Укажите наименьшее положительное пятизначное число x, при вводе которого алгоритм печатает сначала 6, а потом 3.
Пояснение. Рассмотрим цикл, число шагов которого зависит от изменения переменной x: while x > 0 do begin y := x mod 10; x:= x div 10; ... end; Т. к. оператор div возвращает целую часть от деления, то при делении на 10 это равносильно отсечению последней цифры. Следовательно, цикл выполниться пять раз. В переменную a записывается остаток от деления числа x на 10 при условии, что этот остаток больше числа уже записанного в переменной a. В переменную b записывается остаток от деления числа числа x на 10 при условии, что этот остаток меньше числа уже записанного в переменной b. Таким образом, в переменную a записывается наибольшая цифра числа x, а в переменную b — наименьшая. Значит, наименьшее число, удовлетворяющее условию задчи — 33336. Ответ: 33336. №3. Ниже записана программа. Получив на вход число x , эта программа печатает два числа, L и M. Укажите наименьшее из таких чисел x, при вводе которых алгоритм печатает сначала 3, а потом 0. var x, L, M: integer; begin readln(x); L:=0; M:=0; while x > 0 do begin L:= L + 1; if x mod 2 = 0 then M:= M + x mod 10; x:= x div 10; end; writeln(L); write(M); end. Пояснение. Рассмотрим цикл, число шагов которого зависит от изменения переменной x: while x > 0 do begin ... x:= x div 10; end; Т. к. оператор div оставляет только целую часть от деления, то при делении на 10 это равносильно отсечению последней цифры. Из приведенного цикла видно, что на каждом шаге от десятичной записи x отсекается последняя цифра до тех пор, пока все цифры не будут отсечены, то есть x не станет равно 0; поэтому цикл выполняется столько раз, сколько цифр в десятичной записи введенного числа, при этом число L столько же раз увеличивается на 1. Следовательно, конечное значение L совпадает с числом цифр в x. Для того, чтобы L стало L=3, x должно быть трёхзначным. Теперь рассмотрим оператор изменения M: if x mod 2 = 0 then M:= M + x mod 10; end; Оператор mod оставляет только остаток от деления, при делении на 10 это последняя цифра x. Чтобы значение M осталось нулевым, нужно, чтобы условие x mod 2 = 0 не выполнялось, либо чтобы выполнялось x mod 10 = 0. А значит, все цифры этого числа могут быть либо нечётными, либо первая цифра нечётная и остльные нули. Но мы ищем минимальное x, поэтому искомое число 100. Ответ: 100. №4. Ниже записана программа. Получив на вход число x , эта программа печатает два числа, L и M. Укажите наименьшее из таких чисел x, при вводе которых алгоритм печатает сначала 3, а потом 8. var x, L, M: integer; begin readln(x); L:=0; M:=0; while x > 0 do begin L:=L+1; if (M < x) and (x mod 2 = 0) then begin M:=x mod 10; end; x:= x div 10; end; writeln(L); write(M); end. Пояснение. Рассмотрим цикл, число шагов которого зависит от изменения переменной x: while x > 0 do begin ... x:= x div 10; end; Т. к. оператор div оставляет только целую часть от деления, то при делении на 10 это равносильно отсечению последней цифры. Из приведенного цикла видно, что на каждом шаге от десятичной записи x отсекается последняя цифра до тех пор, пока все цифры не будут отсечены, то есть x не станет равно 0; поэтому цикл выполняется столько раз, сколько цифр в десятичной записи введенного числа, при этом число L столько же раз увеличивается на 1. Следовательно, конечное значение L совпадает с числом цифр в x. Для того, чтобы L стало L=3, x должно быть трёхзначным. Теперь рассмотрим оператор изменения M: if (M < x) and (x mod 2 = 0) then begin M:=x mod 10; end; Оператор mod оставляет только остаток от деления, при делении на 10 это последняя цифра x. Уже на первом шаге можно получить x mod 10 = 8, если последняя цифра числа x есть 8. Далее можно сделать так, чтобы M больше не менялось: для этого нарушим условие x mod 2 = 0, т. е. сделаем первые две цифры исходного числаx нечётными, при этом нам уже не будет важно условие M < x. Тогда наименьшее значение вводимого числа x = 118. Ответ: 118. №5. Ниже записана программа. Получив на вход число x , эта программа печатает два числа, a и b. Укажите наименьшее из таких чисел x, при вводе которых алгоритм печатает сначала 2, а потом 72. var x, a, b: integer; begin readln(x); a:=0; b:=1; while x>0 do begin a:=a+1; b:=b*(x mod 10); x:= x div 10; end; writeln(a); write(b); end. Пояснение. Рассмотрим цикл, число шагов которого зависит от изменения переменной x: while x > 0 do begin ... x:= x div 10; end; Т. к. оператор div оставляет только целую часть от деления, то при делении на 10 это равносильно отсечению последней цифры. Из приведенного цикла видно, что на каждом шаге от десятичной записи x отсекается последняя цифра до тех пор, пока все цифры не будут отсечены, то есть x не станет равно 0; поэтому цикл выполняется столько раз, сколько цифр в десятичной записи введенного числа, при этом число a столько же раз увеличивается на 1. Следовательно, конечное значение a совпадает с числом цифр в x. Для того, чтобы a стало a = 2, x должно быть двузначным. Теперь рассмотрим оператор изменения b: while x>0 do begin b:=b*(x mod 10); end; Оператор mod оставляет только остаток от деления, при делении на 10 это последняя цифра x; следовательно, число b получается произведением цифр числа x. Представим число 72 в виде: 72 = 9 * 8. Другого представления, в котором оба множителя однозначные число 72 не имеет. Следовательно, минимальное число x = 89. Ответ: 89. M:= M + (x mod 10) div 2 sites.google.com›…reseniezadanijinformatikipoege… end; writeln(L); write(M) ... Т. к. оператор div оставляет только целую часть от деления, то при делении на 10 это равносильно отсечению последней цифры. ... Теперь рассмотрим изменение b: while x>0 do begin. Читать ещё |