Ferramentas de Usuário

Ferramentas de Site


dev_geral:pascal:snippet:amigos

Tabela de Conteúdos

Números amigos

O desafio

Desafio no fórum

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.
dev_geral/pascal/snippet/amigos.txt · Última modificação em: 2018/05/14 21:37 (edição externa)