Var ar:array[1..n] of integer; ars:array[1..n] of string; i,k:integer; begin for i:=1 to n do begin readln(ar[i]); str(ar[i],ars[i]); if pos('3',ars[i])<>0 then inc(k); end; write('Res=',k); end.
Пример ввода: 135 246 357 468 579 Пример вывода: Res=2
// F# [<EntryPoint>] let main argv = let rec ( ** ) x n = match n < 1 with | true -> 1 | false -> x * (x ** (n-1)) let rec sumDigits x = match x with | x when x < 10 -> (x, 1) | x -> let res = x / 10 |> sumDigits ((res |> fst) + (x % 10), (res |> snd) + 1) let isArmstrong x = let digitsInfo = sumDigits x x = (fst digitsInfo) ** (snd digitsInfo) let a = System.Console.ReadLine() |> System.Int32.Parse let b = System.Console.ReadLine() |> System.Int32.Parse let result = [a..b] |> List.filter (isArmstrong) printf "Result: %A" result System.Console.ReadKey true |> ignore 0
Идем по программе от конца к началу. Программа выводит значения x=1 и y=0. y = b-x ⇒ b = y+x=0+1 = 1 Значение b = 1 найдено. x = (a+2*b) div 5; (a+2*1) div 5 = 1; (a+2) div 5 = 1 Отметим, что div - это операция целочисленного деления, которая отбрасывает остаток. Допустим, остаток был нулевой, тогда а+2 = 5 ⇒ a=3 Но остаток мог быть и ненулевым! При делении на 5 остатком могут быть числа от 0 до 4, следовательно, в числителе могло быть значение на 1,2,3 или 4 большее, т.е. значение а могло быть не только 3, но и 4,5,6,7. ответ:
Const
n=5;
Var
ar:array[1..n] of integer;
ars:array[1..n] of string;
i,k:integer;
begin
for i:=1 to n do
begin
readln(ar[i]);
str(ar[i],ars[i]);
if pos('3',ars[i])<>0 then inc(k);
end;
write('Res=',k);
end.
Пример ввода:
135
246
357
468
579
Пример вывода:
Res=2