Дружественные числа – это пара различных чисел, сумма всех делителей одного числа равна другому числу пары. Например, для чисел 220 и 284 сумма всех их делителей равна друг другу (220 = 1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 24 + 44 + 55 + 110 = 284, и наоборот). Задача состоит в написании программы, которая находит первые два дюжины пар дружественных чисел.
В представленном коде есть проблема: программа выдает повторяющиеся пары чисел, что не соответствует заданию. Проблема заключается в том, что при проверке уже найденных чисел программа не идет дальше 35-го элемента в массивах, что приводит к тому, что повторяющиеся пары не обнаруживаются.
program FriendlyNumbers;
type
List = array of Integer;
var
Num, Sum, Sum2, C, C2, C3, C4, CheckNum, LastNum: Integer;
NumUsed: String;
CheckedNum, CheckedSum: List;
begin
Num := 200;
while C3 <= 23 do
begin
// ... (код для нахождения делителей)
if Num = Sum2 then
begin
// Проверка на уникальность
if (C2 <> LastNum) and (NumUsed <> 'T') and (Num < C2) then
begin
// Вывод уникальной пары
C3 := C3 + 1;
Writeln(C3, ') ', Num:8, C2:8);
LastNum := Num;
end;
// Добавление в список проверенных чисел
if CheckNum < Length(CheckedNum) then
begin
CheckedNum[CheckNum + 1] := Num;
CheckedSum[CheckNum + 1] := C2;
Inc(CheckNum);
end;
end;
// ... (остальная часть кода)
end;
// Проверка всех элементов списка
for C4 := Low(CheckedNum) to High(CheckedNum) do
begin
NumUsed := 'F';
if CheckedNum[C4] <> 0 then
begin
for C := Low(CheckedSum) to High(CheckedSum) do
begin
if CheckedSum[C] = CheckedNum[C4] then
NumUsed := 'T';
if CheckedSum[C] = CheckedNum[C4] then
NumUsed := NumUsed + (CheckedSum[C] <> CheckedNum[C] ? 'T' : 'F');
end;
if (NumUsed = 'FF') then
begin
if CheckedNum[C4] < CheckedSum[C4] then
Writeln('(', CheckedNum[C4]:8, ' ', CheckedSum[C4]:8, ')');
end;
end;
end;
Readln;
end.
Для исправления ошибки, необходимо увеличить размер массивов CheckedNum и CheckedSum, чтобы они могли вместить все необходимые элементы, и изменить логику проверки на уникальность, чтобы она учитывала все элементы массивов. Также следует исправить условие в цикле, который выводит пары, на Num < C2, чтобы сначала выводилась меньшая пара чисел.
В заключение, важно тщательно проверять логику программы и правильно обрабатывать данные, чтобы избежать повторений и других ошибок в выводе.
Необходимо исправить программу нахождения дружественных чисел в Delphi и Pascal, устранив повторения пар чисел в выводе, путем увеличения размеров массивов и корректировки логики проверки уникальности.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS