По поводу первой задачи :
Код:
Uses
Crt;
Var
I, J, K, M, Sum: LongInt; //задаём переменные I,J - счётчики
B: Array[1..50] Of LongInt; //M - ограничение, K - счётчик делителей, Sum - сумма делителей
//B - Массив делителей - сюда заносятся найденные делители числа
Begin
ClrScr;
Write('введите ограничение: ');
ReadLn( M ); //Вводим M с клавиатуры
I := 1; //Задаём начальное значение I = 1
//I - это счётчик чисел, тестирумых на совершенность,
//ему поочерёдно присваиваются значения, от 1 до M затем они тестируются
//на совершенность, и если они совершенные, то выводятся на экран.
While I <= M Do //пока I не больше M выполнить
Begin
Sum := 0;
K := 1; //Обнуляем значения суммы делителей и счётчика делителей для каждого нового тестируемого числа
For J := 1 To I - 1 Do //Ищем все делители числа I, они могут находиться в диапазоне от 1 до I-1
If I Mod J = 0 Then //если J является делителем числа I то
Begin
B[K] := J; //записываем его в массив делителей
Inc( K ); //увеличиваем счётчик делителей
End;
For J := 1 To K - 1 Do //находим сумму всех делителей
Sum := Sum + B[J];
If I = Sum Then //если она совпадает с исходным числом, то
Write( ' ' , I ); //выводим его на экран
Inc(I); //тестируем следующее число
End;
ReadLn;
End.
Добавлено через 1 час 43 минуты
Теперь со второй.....
Код:
Uses Crt;
Var
Ch, P, S, Sum, I, J, F, M, G: LongInt; //Объявление переменных:
//J - счётчик, P - степень двойки в разложении 2^(p-1)*( 2^p - 1)
//S - 2^p, Ch - тестируемое число, Sum - сумма делителей
//M - ограничение P, G - двоичное представление числа
//I, F - в программе не используютя, то есть лишние в данной секции
Procedure Sistema( N: LongInt; Var G: LongInt ); //Продцедура, которая записывает двоичное представление N в переменную G
Var
T: Array[1..10] Of LongInt; //Массив, который хранит значения регистров числа в двоичной записи
K: LongInt; //Длина двоичной записи числа
Begin
J := 0;
K := 0; //Обнуляем значение счётчика и длины двоичной записи числа
While N >= 1 Do //Пока N больше или равно 1
Begin
Inc( K );
Inc( J ); //Увеличиваем J и K на единицу
T[J] := N Mod 2; //Вычисляем K тый регистр двоичной записи числа
N := N Div 2; //Уменбшаем N в два раза, чтоб узнать K+1 ый регистр
End;
For J := 1 To K Do
G := G * 10 + T[K + 1 - J]; //Записываем в G полученное представление
End;
Begin
ClrScr;
Write( 'ограничение: m=' );
ReadLn( m ); //Ввод ограничения M с клавиатуры
P := 1;
S := 2; //Задаём начальные значения P и S
While P <= M Do //Данный алгоритм тестирования совершенности числа идентичен представленному в предыдущей задаче
Begin //За исключением того, что проверяет не само число счётчик, а число Ch равное 2^(p-1)*(2^p-1)
Ch := (S Div 2) * (S - 1); //Собственно вычисление Ch
If Ch Mod 2 = 0 Then //Проверяем чётно ли Ch
Begin
Sum := 0; //Обнуляем сумму делителей
For J := 1 To Ch - 1 Do
If Ch Mod J = 0 Then
Sum := Sum + J; //Ищем делители числа Ch и считаем их сумму
If Ch = Sum Then //Если сумма делителей совпадает с числом то
Begin
Sistema( Ch, G ); //Получаем двоичное представление числа с помощью вышеописанной процедуры Sistema
WriteLn( G ); //Выводим двоичное представление
End;
End;
Inc( P ); //Увеличиваем степень P на 1
S:= S * 2; //Соответсвенно число S равное 2^p увеличивается в 2 раза
End;
ReadLn;
End.