Поразрядное сравнение чисел

Задача

Даны два пятизначных числа, необходимо найти количество совпадений по две одинаковые цифры в равносильных разрядах чисел, а так же количество совпадений по две одинаковые цифры в различных разрядах этих чисел. Цифра, которая уже участвовала в одной паре совпадения, не учитывается повторно. Например, даны числа 12345 и 27376. Количество совпадений одинаковых цифр в равносильном разряде равно 1 (это цифра 3), количество совпадений одинаковых цифр в различных разрядах равно 1 (это цифра 2).

Решение

Описание переменных: 

a, b – заданные числа;
a_arr, b_arr – массивы цифр, из которых состоят числа;
a_dig, b_dig – массивы для хранения информации о совпавших цифрах.

Алгоритм решения задачи: 

{2} Числа раскладываются на цифры, которые размещаются в массивах. Нахождение остатка по основанию 10 дает младший разряд числа. При этом сами числа постепенно уменьшаются, избавляясь от текущих младших разрядов (div 10). Поскольку извлечение цифр происходит с конца, массивы, куда они заносятся, "прокручиваются" с конца: сначала заполняются пятые элементы массива, затем четверные и т.д.

{3} Для того, чтобы найти одинаковые цифры в равносильных разрядах, достаточно сравнить элементы массивов, находящиеся в одинаковых позициях двух массивов. При этом надо где-то сохранить информацию о разрядах, цифры которых совпали. Введем два дополнительных массива (a_dig и b_dig). Изначально в языке программирования Pascal массивы заполнены нулями. Пусть элементы этих массивов соответствуют разрядам чисел. Если цифра числа нашла себе пару среди такого же разряда второго числа, то в соответствующие разрядам ячейки массивов записываются единицы.

{4} Берем очередной элемент массива первого числа. Если соответствующий ему элемент из массива a_dig равен нулю (что значит, совпадений не было), то сравниваем его со всеми элементами второго массива числа, которые также не нашли себе пару. Если при переборе совпадение находится, то в соответствующие ячейки массивов a_dig и b_dig помещаются цифры 2.

{5} Количество одинаковых цифр в равносильных разрядах равно количеству единиц в массиве a_dig.

{6} Количество одинаковых цифр в различных разрядах равно количеству двоек в массивеa_dig.

Массив b_dig содержит туже информацию о количестве единиц и двоек. Однако двойки находятся в иных элементах массива.

Программа на языке Паскаль: 

 

const n = 5;
var
    a, b: longint;
    a_arr, b_arr: array[1..n] of byte;
    a_dig, b_dig: array[1..n] of byte;
    i,j: byte;
 
begin
{1} write('Первое число: ');
    readln(a);
    write('Второе число: ');
    readln(b);
 
{2} for i:=n downto 1 do begin
        a_arr[i] := a mod 10;
        a := a div 10;
        b_arr[i] := b mod 10;
        b := b div 10;
    end;
 
{3} for i:=1 to n do
        if a_arr[i] = b_arr[i] then begin
            a_dig[i] := 1;
            b_dig[i] := 1;
        end;
 
{4} for i:=1 to n do
        if a_dig[i] = 0 then
            for j:=1 to n do
                if b_dig[j] = 0 then
                    if a_arr[i] = b_arr[j] then begin
                        a_dig[i] := 2;
                        b_dig[j] := 2;
                    end;
 
{5} write('Кол-во одинаковых цифр в равносильных разрядах: ');
    j := 0;
    for i:=1 to n do
        if a_dig[i] = 1 then
            j := j + 1;
    writeln(j);
 
{6} write('Кол-во одинаковых цифр в различных разрядах: ');
    j := 0;
    for i:=1 to n do
        if a_dig[i] = 2 then
            j := j + 1;
    writeln(j);
 
readln;
end.

Тема

Одномерные массивы

Уровень

Сложные задачи

Комментарии

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

Например: заданы числа 12345 и 27376.
Количество совпадений одинаковых цифр в равносильном разряде равно 1, это цифра 3.
Количество совпадений одинаковых цифр в различных разрядах равно 1, это цифра 2.

Ответ на от Гость

var a,b:string [5];
    i,j,k:byte;
    num, num1: set of byte;
begin
     writeln ('Введите два числа');
     readln (a,b);
     for i:=5 downto 1 do
         if a[i]=b[i]
            then
                k:=k+1;
     writeln ('Количество совпадений одинаковых цифр в равносильном разряде - ', k);
 
     k:=0; num:=[]; num1:=[];
     for i:=1 to 5 do
         for j:=1 to 5 do
             if (a[i]=b[j]) and (i<>j) and not(i in num) and not(j in num1)
                     then
                         begin
                              k:=k+1;
                              writeln (a[i]);
                              num:=num+[i];
                              num1:=num1+[j];
                         end;
     writeln ('Количество совпадений одинаковых цифр в различных разрядах - ', k);
 
end.

ЗЫ: там есть один маленький косяк - уже не помню, но надо еще условие добавить (не на всех наборах данных работает)

Добавить комментарий