Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

Задача в неделю

Задача 1. "Число" (20 баллов)

Задано целое число N (1£N£2147483647).

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

Технические требования:

Входной файл: INPUT. TXT

Выходной файл: OUTPUT. TXT

Ограничение по времени тестирования: по 1 секунде на один тест.

Формат входных данных:

Входной файл INPUT. TXT содержит одно целое число N.

Формат выходных данных:

Выходной файл OUTPUT. TXT должен содержать одно число - искомое наименьшее натуральное число. Если такого числа не существует, то записать в выходной файл значение 0.

Пример файла входных данных:

10

Пример файла выходных данных (для приведенного выше входного файла):

25

Разбор задачи № 1

Проведем разложение заданного числа на простые множители. Если в этом разложении встречается простое число большее 10, то ответом будет 0. Иначе так сгруппируем простые множители 2, 3, 5 и 7, чтобы обеспечить минимум искомого числа. Достаточно очевидно, что для этого надо выделить наибольшее число делителей 9, 8, …, 3, 2 и записать соответствующее количество этих цифр в порядке возрастания. Этот алгоритм и записан в следующей программе.

var

n, n1, k: longint;

i : integer;

f1, f2 : text;

begin

assign(f1,'input. txt'); reset(f1);

assign(f2,'output. txt'); rewrite(f2);

read(f1,n); n1:=0; k:=1;

for i:=9 downto 2 do

while n mod i=0 do

begin n1:=n1+i*k; k:=k*10; n:=n div i end;

if n>1 then n1:=0;

write(f2,n1); close(f2)

НЕ нашли? Не то? Что вы ищете?

end.

В этой программе искомое число записывается как десятичное типа longint. Но, например, для исходного числа равного 230, искомое число равно 8888888888 (10 восьмерок) и выходит за границы указанного типа. Приходится для хранения искомого числа использовать другое представление. Большинство участников для этого использовали строковый тип, в представленной ниже программе с этой целью использован массив от 2 до 9, в котором хранится количество используемых в записи числа цифр.

var

n : longint;

i, j : integer;

a : array [2..9] of integer;

f1, f2 : text;

begin

assign(f1,'input. txt'); reset(f1);

assign(f2,'output. txt'); rewrite(f2);

read(f1,n);

for i:=2 to 9 do a[i]:=0;

for i:=9 downto 2 do

while n mod i=0 do

begin a[i]:=a[i]+1; n:=n div i end;

if n>1 then write(f2,0)

else for i:=2 to 9 do

for j:=1 to a[i] do write(f2,i);

close(f2)

end.

Задача 2. "Сообщение" (20 баллов)

В сообщении, состоящем из одних русских букв и пробелов, каждую букву заменили ее порядковым номером в русском алфавите (А - 1, Б - 2, …, Я - 33), а символ пробел нулем.

Требуется написать программу, которая по заданной последовательности цифр (не более 100) находит количество исходных сообщений, из которых она могла бы получиться.

Технические требования:

Входной файл: INPUT. TXT

Выходной файл: OUTPUT. TXT

Ограничение по времени тестирования: по 1 секунде на один тест.

Формат входных данных:

Входной файл INPUT. TXT содержит последовательность цифр.

Формат выходных данных:

Выходной файл OUTPUT. TXT должен содержать одно число - искомое количество исходных сообщений.

Пример файла входных данных:

1025

Пример файла выходных данных (для приведенного выше входного файла):

4

Разбор задачи № 2

Обозначим через A(n) требуемое количество исходных сообщений, из которых восстанавливаются первые n символов кода. Легко получить, что A(n)=A(n-1)+A(n-2), если два последних символа (n-1-й и n-й) составляют допустимый код (10, 11, …, 33, но не 01, 02, …, 09, 34, 35, …, 99), и A(n)=A(n-1) иначе.

Это реализовано в следующей программе

var

a, b, c : longint;

i : integer;

s, s1, s2 : string;

f1, f2 : text;

begin

assign(f1,'input. txt'); reset(f1);

assign(f2,'output. txt'); rewrite(f2);

readln(f1,s);

a:=1; b:=1; s1:=s[1];

for i:=2 to length(s) do

begin

s2:=s[i]; s1:=s1+s2; c:=b;

if ('10'<=s1) and (s1<='33') then c:=c+a;

a:=b; b:=c; s1:=s2

end;

write(f2,c); close(f2)

end.

Но A(n) для больших n может оказаться больше максимального в используемом типе longint, поэтому надо организовать сложение в столбик двух длинных чисел. Это реализовано так

var

a, b, c : array [1..100] of byte;

i, na, nb, nc : integer;

s, s1, s2 : string;

f1, f2 : text;

procedure summa;

var i, p : integer;

begin

p:=0;

for i:=1 to nc do

begin p:=p+c[i]+a[i]; c[i]:=p mod 10; p:=p div 10 end;

if p>0 then begin nc:=nc+1; c[nc]:=p end

end;

begin

for i:=1 to 100 do begin a[i]:=0; b[i]:=0; c[i]:=0 end;

assign(f1,'input. txt'); reset(f1);

assign(f2,'output. txt'); rewrite(f2);

readln(f1,s);

na:=1; a[1]:=1; nb:=1; b[1]:=1; s1:=s[1];

for i:=2 to length(s) do

begin

s2:=s[i]; s1:=s1+s2; nc:=nb; c:=b;

if ('10'<=s1) and (s1<='33') then summa;

na:=nb; a:=b; nb:=nc; b:=c; s1:=s2

end;

for i:=nc downto 1 do write(f2,c[i]); close(f2)

end.

Задача 3. "Простые гири" (40 баллов)

Имеются гири с массами: 1 г, 2 г, …, N г (N£500000).

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

Технические требования:

Входной файл: INPUT. TXT

Выходной файл: OUTPUT. TXT

Ограничение по времени тестирования: по 5 секунд на один тест.

Формат входных данных:

Входной файл INPUT. TXT содержит число N.

Формат выходных данных:

В выходной файл OUTPUT. TXT выводится список найденных пар. Каждая пара выводится в одной строке через пробел.

Пример файла входных данных:

7

Пример файла выходных данных (для приведенного выше входного файла):

1 6

7 4

5 2

Разбор задачи № 3

Эта задача предлагалась на IX Всероссийской олимпиаде школьников по информатике в апреле 1997 года в Санкт-Петербурге. Ее автором является Сергей Геннадьевич Волченков, кандидат технических наук, доцент Ярославского государственного университета. Сергей Геннадьевич уже много лет работает в жюри Всероссийских олимпиад не только по информатике, но и по математике. Им придумано много задач для различных соревнований школьников по математике и информатике. Его задачи публиковались в журналах "Квант", "Информатика и образование", приложении "Информатика" к газете "Первое сентября", других изданиях. Надеюсь, что в дальнейшем мы еще не раз встретимся с интересными задачами в нашем проекте.

Авторское решение задачи состоит в следующем. Найдем первое большее N простое число. Обозначим его через P. Тогда пары чисел (P-N, N), (P-N+1, N-1), … имеют суммарный вес P и удовлетворяют условию задачи. Легко заметить, что все числа от P-N до N входят в одну из пар. После этого осталось решить такую же задачу с новым значением N, равным P-N-1. Этот процесс продолжается до тех пор, пока значение N больше одного. При этом получается, что найденное количество пар чисел равно максимально возможному количеству пар из различных чисел от 1 до N. Таким образом, найдено решение, удовлетворяющее всем условиям задачи.

Рассмотренный выше алгоритм реализован в следующей программе

var

n, p, i, j : longint;

f1, f2 : text;

function prostoe(n:longint): boolean;

var i, j : longint;

begin

j:=0;

for i:=1 to n do

if n mod i = 0 then j:=j+1;

if j=2 then prostoe:=true else prostoe:=false

end;

begin

assign(f1,'input. txt'); reset(f1);

assign(f2,'output. txt'); rewrite(f2);

read(f1,n);

while n>1 do

begin

p:=n+1;

while not prostoe(p) do p:=p+1;

i:=p-n; j:=n; n:=i-1;

while i<j do

begin

writeln(f2,i,' ',j);

i:=i+1; j:=j-1

end

end;

close(f2)

end.

В ниже приведенной программе использован для определения простоты числа более совершенный алгоритм.

var n, p, i, j : longint;

f1, f2 : text;

function prostoe(n:longint): boolean;

var i, j : longint; t : boolean;

begin

j:=2; t:=true;

while t and (j*j<=n) do

begin

if n mod j=0 then t:=false;

j:=j+1

end;

prostoe:=t

end;

begin

assign(f1,'input. txt'); reset(f1);

assign(f2,'output. txt'); rewrite(f2);

read(f1,n);

while n>1 do

begin

p:=n+1;

while not prostoe(p) do p:=p+1;

i:=p-n; j:=n; n:=i-1;

while i<j do

begin

writeln(f2,i,' ',j);

i:=i+1; j:=j-1

end

end;

close(f2)

end.

Задача 4. "Последняя цифра" (20 баллов).

Задано натуральное число N (1£N£9999).

Требуется написать программу, определяющую последнюю ненулевую цифру числа N!=1*2*3*…*N.

Технические требования:

Входной файл: INPUT. TXT

Выходной файл: OUTPUT. TXT

Ограничение по времени тестирования: по 1 секунде на один тест.

Формат входных данных:

Входной файл INPUT. TXT содержит число N.

Формат выходных данных:

В выходной файл OUTPUT. TXT найденная цифра.

Пример файла входных данных:

5

Пример файла выходных данных (для приведенного выше входного файла):

2

Разбор задачи № 4

Факториал введенного числа может заканчиваться нулями. Они получаются произведением 2 и 5. Поэтому вначале посчитаем количество пятерок в разложении факториала на простые множители. Далее, используя легко доказываемое свойство остатка от деления на 10 (a*b mod 10=(a mod 10)*(b mod 10) mod 10) и пропуская умножение на 5 и на такое же число умножений на 2, найдем искомую цифру.

Рассмотренный выше алгоритм реализован в следующей программе

var

n, i, j, k, km, f : integer;

begin

assign(input,'input. txt'); reset(input);

read(n);

f:=1;

km:=0; k:=5;

while n div k>0 do begin km:=km+n div k; k:=k*5 end;

for i:=2 to n do

begin

j:=i;

while j mod 5 =0 do j:=j div 5;

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7