Тема 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.