Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник.docx
Скачиваний:
36
Добавлен:
21.12.2018
Размер:
2.15 Mб
Скачать

Определение различных цифр, входящих в число

Задача:

Какие различные цифры входят в целое число.

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

n – анализируемое число;

digits – массив различных цифр, из которых состоит число n;

q_digits – количество цифр в массиве;

digit – извлеченная из числа цифра;

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

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

  1. Избавляемся от знака числа с помощью функции abs.

  2. Обнуляем количество цифр в массиве (изначально массив пуст).

  3. После извлечения очередной цифры числа с конца (n mod 10) предполагаем, что ее еще нет в массиве (flag:= false).

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

  5. Если флаг остался в значении false, то увеличиваем количество цифр в массиве на единицу и записываем очередную цифру в массив.

  6. Избавляемся от последней цифры числа (n div 10).

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

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

var

n: longint;

digits: array[1..10] of byte;

q_digits: byte;

digit: byte;

i: byte;

flag: boolean;

begin

write('Input number: ');

readln(n);

if n < 0 then

n:= abs(n);

q_digits:= 0;

repeat

digit:= n mod 10;

flag:= false;

for i:=1 to q_digits do

if digit = digits[i] then begin

flag:= true;

break

end;

if flag = false then begin

q_digits:= q_digits + 1;

digits[q_digits]:= digit;

end;

n:= n div 10

until n = 0;

for i:=q_digits downto 1 do

write(digits[i]:3);

readln

end.

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

Задача:

Даны два пятизначных числа, необходимо найти количество совпадений по две одинаковые цифры в равносильных разрядах чисел, а так же количество совпадений по две одинаковые цифры в различных разрядах этих чисел. Цифра, которая уже участвовала в одной паре совпадения, не учитывается повторно. Например, даны числа 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.