Ir para o conteúdo

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.