Найти одинаковые цифры двух чисел

Задача

Даны два числа. Определить цифры, входящие в запись как первого так и второго числа.

Решение

В цикле пока одно из чисел полностью не сократится будем выполнять следующее:

  1. Сохраним последнюю цифру первого (a) числа в переменной d.
  2. После этого сразу же удалим эту цифру из числа.
  3. Присвоим переменной c второе введенное число (b). Значение c будем изменять. Значение b должно сохраниться для последующих проверок совпадающих цифр.
  4. Во внутреннем цикле перед удалением последней цифры числа c будем проверять совпадает ли она с цифрой d. Если это так, то выведем ее на экран и прервем внутренний цикл.

Таким образом, каждая цифра первого числа будет сравниваться со всеми цифрами второго числа.

var
    a, b, c: longint;
    d: byte;
begin
    readln(a,b);
    while a > 0 do begin
        d := a mod 10;
        a := a div 10;
        c := b;
        while c > 0 do begin
            if c mod 10 = d then begin
                write(d,' ');
                break;
            end;
            c := c div 10;
        end;
    end;
    writeln;
end.

Пример выполнения кода:

564 8954
4 5

Данная программа имеет следующую особенность. Если в первом числе есть одинаковые цифры, каждая из них будет сравниваться с цифрами второго числа, и два раза найдется совпадение. Пример выполнения с побочным эффектом:

54436 341
3 4 4

Комментарии

Более изящное решение на множествах:
var
  a, b: LongInt;
  nums_a, nums_b: set of Byte;
begin
  nums_a:= [];
  nums_b:= [];
  // вводим числа a и b 
  ReadLn(a, b);
  // выбираем все цифры из чисел a и b в множества nums_a и nums_b соответственно
  while (a>0)and(b>0) do begin
    if (a<>0) then nums_a:= nums_a + [(a mod 10)];
    if (b<>0) then nums_b:= nums_b + [(b mod 10)];
    a:= a div 10;
    b:= b div 10;
  end;
  // выводим результат на экран (пересечение множеств)
  WriteLn('Общие цифры во введенных числах: ', nums_a * nums_b)
end.