Function HasK(n:longint;k:char):boolean; { возвращает true, если в числе n имеется цифра 'k' } var ns:string; begin Str(n,ns); { переходим к символьному изображению числа } HasK:=(Pos(k,ns))>0 end;
var a,b,i,kol:longint; k:char; begin Write('Введите интервал чисел: '); Readln(a,b); Write('Введите искомую цифру: '); Readln(k); kol:=0; for i:=a to b do if HasK(i,k) then kol:=kol+1; Writeln('Количество чисел с цифрой ',k,': ',kol) end.
Тестовое решение: Введите интервал чисел: 136 523 Введите искомую цифру: 5 Количество чисел с цифрой 5: 96
1) Результатом работы должно быть число больше, чем 43, но при этом быть минимальным. Т.е в двоичной с.с это скорее всего 6-значное число, т.к семизначное даст нам результат больше или равный 64. 2) Так как над начальной записью действия производятся дважды, то чтобы получилось 6-значное число в итоге работы программы нужно для начала взять 4-значное. Возьмем (для пробы) 1000. После выполнения алгоритмя число станет 100010. Первый раз к числу прибавится 1, т.е остаток будет 1, второй раз к числу прибавится 0. При переводе этого числа в 10-ю с.с получим 33. МАЛО. 3) Рассмотрим несколько вариантов таким же образом и остановимся, наконец, на том, который будет удовлетворять работе алгоритма. 4) Это 1011. После выполнения первого построения остаток будет 1, после второго добавится 0. В результате получится 101110(2)= 32+8+4+2=46(10)
1. Отметим, что приписывание к двоичному числу двух младших разрядов предполагает предварительный сдвиг этого числа влево на два разряда (что равносильно умножению на 2²=4), а затем установку двух младших разрядов в соответствующие приписываемым битам значения. Следовательно, можно записать, что 4N+a>43, где a - число, образованное приписываемыми справа битами, которое не может превышать 11(2)=3(10) 4N+[0..3]≥44, откуда минимальное N=11 Теперь запишем N=11 в двоичной системе и применим к нему заданный алгоритм. N=1011(2), число единиц три, нечетное, приписываем 1, получая 10111. Теперь число единиц четное, приписываем 0 и получаем R=101110(2). В десятичной записи ему соответствует число 46. ответ: 46
{ возвращает true, если в числе n имеется цифра 'k' }
var ns:string;
begin
Str(n,ns); { переходим к символьному изображению числа }
HasK:=(Pos(k,ns))>0
end;
var
a,b,i,kol:longint;
k:char;
begin
Write('Введите интервал чисел: '); Readln(a,b);
Write('Введите искомую цифру: '); Readln(k);
kol:=0;
for i:=a to b do
if HasK(i,k) then kol:=kol+1;
Writeln('Количество чисел с цифрой ',k,': ',kol)
end.
Тестовое решение:
Введите интервал чисел: 136 523
Введите искомую цифру: 5
Количество чисел с цифрой 5: 96