Números amigos
O desafio
Título:
Números amigos
Objectivo:
Recentemente aprendi no programa "Sabe mais do que um miúdo de 10 anos?" o que são números amigos.
Para aqueles que não sabem: dois números são amigos se a sua soma der origem a um número cujo algarismo das unidades seja 0. Ou seja, que possa ser expresso como dezenas sem casas decimais.
Por exemplo, o 26 e o 4 são amigos, pois a sua soma dá 30. O 26 e o 5 já não.
O que se pretende é que, dada uma lista de números (não necessariamente diferentes), nos digam quantos pares não ordenados e diferentes de números amigos existem.
Explicação de Input
Linha 1 - um inteiro N (2 <= N <= 5000), representando o número de inteiros a ler. (não deve ser considerado)
Linhas 2 - N+1 - N inteiros a ser considerados
Uma solução
Post da resposta no tópico do desafio | Testar no Ideone
program friends_challenge;
uses crt;
type TPair = record
a, b : byte;
end;
TList = array of byte;
TFrs = array of TPair;
procedure Pause; begin repeat until readkey = #13; end;
procedure GetNumbers(const q : byte; var list : TList);
var i : byte;
begin
SetLength(list, q);
for i:=0 to q-1 do
readln(list[i]);
end;
procedure GetFriends(const list : TList; var frs : TFrs);
const MAX = 255;
var i, j : byte;
seen : array [0..MAX, 0..MAX] of boolean;
begin
for i:=0 to MAX do for j:=0 to MAX do seen[i,j]:=false;
for i:=low(list) to high(list)-1 do
for j:=i+1 to high(list) do
if ((list[i] + list[j]) mod 10 = 0) and not seen[list[i], list[j]] then begin
SetLength(frs, Length(frs)+1);
frs[Length(frs)-1].a := list[i];
frs[Length(frs)-1].b := list[j];
seen[list[i], list[j]] := true;
seen[list[j], list[i]] := true;
end;
end;
var n : byte;
numbers : TList;
friends : TFrs;
elem : TPair;
begin
repeat
readln(n);
if (n < 2) then writeln('Erro, deve ser >=2 !');
until (n >= 2);
GetNumbers(n, numbers);
GetFriends(numbers, friends);
write('Os ', Length(friends), ' pares amigos sao: ');
for elem in friends do write('(', elem.a, ',', elem.b, ') ');
Pause;
end.