double arrow

Тема 1: «Работа с длинными числами»



 

«Число души»

Саша увлеклась нумерологией. Из книги по нумерологии Саша узнала, что любую цифровую последовательность можно свести к «числу души».

Алгоритм получения числа души следующий: рассмотрим любое натуральное число и найдем сумму его цифр, потом сумму цифр полученного числа и так далее, пока не получим одноцифровое число или числа 11, 12, 21.

Саша увлеклась и рассчитывала «число души» для любой цифровой последовательности, которая ей встречалась.

Напишите программу, которая облегчит Саше жизнь и рассчитает за нее «число души». Необходимо написать программу, которая для заданного N (N<10100) находит его «число души».

Входные данные: INPUT.TXTодна строка, которая содержит натуральное число N.

Выходные данные: OUTPUT.TXTодна строка, которая содержит число души числа N.

INPUT.TXT OUTPUT.TXT

 

program chislo;

var

f: text; // файловая переменная

s, sum_n: word; {переменные для хранения итоговой суммы и промежуточной суммы}

ch:char; // переменная для хранения, считанного символа

begin

assign(f, 'input.txt'); //связываем файл и файловую переменную

reset(f); //открываем файл для чтения

s:=0; // обнуляем переменную, которая хранит сумму цифр




{Так как число может быть слишком большим осуществляем посимвольное считывание из файла. Полученный символ преобразуем в цифру}

while not eof(f) do // Считываем, пока не достигнем конца файла

begin

read(f, ch); // чтение из файла

s:=s+(ord(ch)-ord('0')); //подчет суммы цифр, заданного числа.

end;

close(f); // закрываем файл

while s>=10 do {пока сумма цифр не станет однозначным числом, считаем сумму цифр}

begin

if(s=11) or(s=12) or(s=21) then break;{если получено число 11, 12 или 21, то прервать работу цикла}

sum_n:=0; // обнуление промежуточной переменной для хранения суммы

{блок нахождения суммы цифр числа}

while s<>0 do

begin

sum_n:=sum_n+s mod 10;

s:=s div 10;

end;

s:=sum_n;// новое значение суммы цифр числа

end;

assign(f,'OUTPUT.txt');// связываем файл с файловой переменной

rewrite(f);// открываем файл для записи

writeln(f,s);//записываем результат

close(f);// закрываем файл

end.

 


Тема 2: Алгоритмы поиска и сортировки

«Забавный конфуз»

Банкир использовал для шифровки кодов от сейфа– следующий алгоритм:

На листике он случайным образом записивал ряд чисел А, состоящий из N элементов А1….Аn. Далее находил его максимальное и минимальное значение (max_a и min_a соответственно). После чего находил сумму элементов ряда S и заменял каждый элемент ряда на разницу суммы S и этого элемента Аi=S-Ai, 1≤N≤N. Кодом являлась разница максимального и минимального элемента в ряду, преобразованом К число раз.



Напишите программу, которая поможет банкиру быстро сгенирировать код.

Входные данные: Confuse.dat. Первая строка входного файла CONFUSE.DAT содержит целые числа N и K, где N - количество элементов в ряду чисел А (2 < N < 10000), а K - количество применений алгоритма кодировки к начальному ряду чисел A, 1 < K < 100. Вторая строка файла содержит N элементов ряда чисел А. Элементы ряда А - целые числа, принадлежащие диапазону от -2 000 000 000 до 2 000 000 000.

Выходные данные: Confuse.sol. Единственная строка выходного файла CONFUSE.SOL должна содержать целое число, которое есть разностью max_А и min_А.

Confuse.dat Confuse.sol
4 2 45 52 47 46

{легкость решения состоит в том, что при таком изменении элементов массива, независимо от количества преобразований, разница между максимальным и минимальным элементом – остается неизменной. Решение задачи сводится к поиску максимального и минимального значения массива. Так же можно упростить задачу, считывая элементы массива из файла непосредственно}

Var

max, min, x: longint;{ переменные для хранения максимального, минимального элемента и элемента массива.}

k,n,i: integer; {k – количество изменений элементов массива, n - количество элементов в массиве}

Begin

{особенности чтени/записи связаны с типами входных и выходных файлов}

assign(Input, 'Confuse.dat'); {связываем файл и файловую переменную. Такой способ (без объявления переменной Input) не работает в PascalABC}

reset(Input);// открываем файл для чтения

readln(n, k); // считываем n и k

max:=-2000000000; {считаем в качестве максимального минимальный элемент диапазона}

min:=2000000000;{считаем в качестве минимального максимальный элемент диапазона}

fori:=1 ton do {цикл для просмотра элементов массива}

Begin

read(x); // считываем i-ый элемент массива

ifx>Max thenMax:=x; {если найден элемент больший максимального – считаем его максимальным}

ifx<Min thenMin:=x; {если найден элемент меньший минимального – считаем его минимальным}

end;

assign(Output,'Confuse.sol');{связываем выходной файл и файловую переменную}

rewrite(Output);// открываем файл для записи

writeln(Max-Min); //выводим результат в файл

{закрываем открытые файлы}

close(input);

close(output);

end.

 




Сейчас читают про: