slavutich-plus2
?>

Склавиатуры вводится целое число k (k< =5 найти и вывести на экран первые к совершенных числа. совершенное число -- натурально число, равное сумме всех своих собственных делителей (т. е. всех положительных делителей, отличных от самого числа). pascal abc функцией

Информатика

Ответы

nailboxru
Program n1;
var k,i: longint;
function sov(n: longint): boolean;
var i,sum: longint;
begin
i:=1;
while i<n do
if ((n mod i)=0) then
begin
sum:=sum+i;
i:=i+1;
end else i:=i+1;
if sum=n then sov:=true else sov:=false;
end;
begin
write('k=');
readln(k);
for i:=1 to k do if sov(i) then write(i,' ');
end.
Олегович Паутова
Представим, что мы знаем ответ на вопрос "чему равна сумма всех выписанных чисел при выполнении вызова F(n)" для всех n < k. Попробуем понять, как найти ответ для n = k.

Что делает F(n)? Читаем текст программы: сначала выводит n, а потом (если n > 0) запускает F(n - 1) и F(n - 3). Обозначим S(n) - сумму всех чисел после вызова F(n), тогда (при n > 0) 
S(n) = n + S(n - 1) + S(n - 3)

Для неположительных n получаем, что S(n) = n (т.к. F(n) просто выводит n и завершает работу, не запуская никаких других F).

Остается только расписать, чему равно S(5)...
S(-2) = -2
S(-1) = -1
S(0) = 0
S(1) = 1 + S(0) + S(-2) = 1 + 0 - 2 = -1
S(2) = 2 + S(1) + S(-1) = 2 - 1 - 1 = 0
S(3) = 3 + S(2) + S(0) = 3 + 0 + 0 = 3
S(4) = 4 + S(3) + S(1) = 4 + 3 - 1 = 6
S(5) = 5 + S(4) + S(2) = 5 + 6 + 0 = 11

ответ. 11.



При исследовании рекурсивных алгоритмов бывает полезно понять, сколько вызовов функций делает программа (например, если рисовать дерево вызовов, это будет показывать количество "стрелочек" на этом дереве). Представим себе, что мы стали выполнять алгоритм на бумаге, попробуем понять, сколько чисел придется выписывать.
Если #(N) - число вызовов процедуры F при наивном вычислении F(N). Понятно, что #(N) = #(N - 1) + #(N - 3) (при N <= 0 #(N) = 1). Не задаваясь целью получить точную формулу для #(N), получим только оценку (на самом деле, весьма показательную).
Очевидно, что #(N - 1) >= #(N - 3), тогда #(N) >= 2 * #(N - 3).
Так как #(0) = 1, то #(3) >= 2 * #(0) = 2, #(6) >= 2 * #(3) >= 2^2, #(9) >= 2 * #(6) >= 2^3, и вообще #(3N) >= 2^N
Отсюда можно предположить, что #(N) растет не медленнее, чем 2^(N/3) >= 1.25^N. Если 1,25^N кажется медленно растущей функцией - это вовсе не так, для N = 100 (это немного, наверно?) получим число, большее миллиарда. Так что если не запоминать промежуточные результаты, результат будет считаться ооочень долго. S(N) также растет быстро, но это уже другая проблема.
mishamedbrat
1. Рассмотрим вариант построения числа 1715 при условии a+b=17, b+c=15.
Число 17 можно получить только двумя и 8+9=17.
Отсюда получаем два варианта: (a=9; b=8) и (a=8; b=9).         (1)
Число 15 можно получить тоже двумя полагая, что одно из слагаемых (b) равно 8 или 9: 9+6 и 8+7, что тоже дает два варианта: (b=9; c=6) и (b=8; c=7).                                                                          (2)
Объединяя (1) и (2) получаем (a=9; b=8; c=7) и (a=8; b=9; c=6), т.е. у нас по-прежнему есть два варианта решения.
2. Теперь рассмотрим вариант построения числа 1715 при условии a+b=15, b+c=17 и упорядочения 17, 15 по убыванию. Легко видеть, что решение будет "симметричным": (a=7; b=8; c=9) и (a=6; b=9; c=8) и это также даст нам два варианта.
3. Объединяя результат получаем, что всего имеется четыре решения, т.е. четыре числа (698, 789, 896, 987).
ответ: 4 числа.

Проверка решения программным путем (Borland Pascal 7.0)
uses Crt;
var
  a,b,c,ab,bc,t,k:byte;
  s1,s2:string;
begin
  ClrScr;
  k:=0;
  for a:=0 to 9 do
  for b:=0 to 9 do
  for c:=0 to 9 do
  begin
    ab:=a+b; bc:=b+c;
    if ab<bc then begin t:=ab; ab:=bc; bc:=t end;
    Str(ab,s1); Str(bc,s2);
    if s1+s2='1715' then begin WriteLn(a,b,c); Inc(k) end
  end;
  Writeln('kol-vo=',k);
  ReadKey
end.

Результат выполнения программы:
698
789
896
987
kol-vo=4

Ответить на вопрос

Поделитесь своими знаниями, ответьте на вопрос:

Склавиатуры вводится целое число k (k< =5 найти и вывести на экран первые к совершенных числа. совершенное число -- натурально число, равное сумме всех своих собственных делителей (т. е. всех положительных делителей, отличных от самого числа). pascal abc функцией
Ваше имя (никнейм)*
Email*
Комментарий*

Популярные вопросы в разделе

ganzashop
Vitalevich1799
Anna-Miron
nailya-abdulova25
red-sun2
ganul
s9152992722344
aregaa
ambiente-deco516
Горина
jurys71242
mantseva
zakupka-marion
mstrshulz
suny84