ХКОИС
ХРРЦ
Регистрация
Забыли пароль?
Логин:
Пароль:
Поиск
Справочные сведения о системе образования Хабаровского края
Новости образования Хабаровского края
Информация и документы из министерства образования и науки Хабаровского края
Хабаровская краевая заочная физико-математическая школа
РЕГИОНАЛЬНАЯ ОЛИМПИАДА ШКОЛЬНИКОВ
Подготовка к олимпиадам по информатике
Подготовка к олимпиадам по информатикеЗадачи прошедших олимпиад > 2012 год. Задачи, рекомендованные для муниципального тура.
2012 год. Задачи, рекомендованные для муниципального тура.
Сумма прописью (100 баллов)
 
          Во многих платежных документах и договорах требуется, чтобы суммы записанные цифрами были рядом записаны прописью, то есть числительными. Это требование введено, чтобы затруднить злоумышленникам подделку документов.
          Напишите программу, которая будет переводить введенное число из цифровой записи в запись числительными.
 
          Входные данные: целое число 0<N<100 в цифровой записи.
          Выходные данные: запись введенного числа числительными.
 
Тесты для проверки решений
 
Входные данные
Выходные данные
1
один
21
двадцать один
70
семьдесят
32
тридцать два
12
двенадцать
17
семнадцать
90
девяносто
85
восемьдесят пять
44
сорок четыре
4
четыре
 
Указания к решению
 
          В задаче рассматриваются однозначные и двузначные числа. Рекомендуется  сначала обработать числа от 20 до 99. Их запись будет состоять из двух числительных, кроме чисел кратных десяти. Нужно выделить цифру, равную числу десятков и напечатать соответствующее ей числительное. От введенного числа нужно отнять десятки, равные напечатанному числительному.
На втором этапе обрабатывается число меньшее 20.   Для этого числа нужно напечатать соответствующее ему числительное. Если остается только 0, то печатать ничего не надо.
Числительные можно поместить в два строчковых массива и печатать элемент соответствующий значению нужного числа. Также можно воспользоваться оператором выбора (в Паскале CASE) или написать нужное количество условных операторов.
 


Раскрыть скобки (100 баллов)
 
Некоторые школьники знают, что круглые скобки нужны не только для написания смайликов. Они используются еще и при составлении арифметических выражений и определяют порядок выполнения арифметических действий. Пусть дано выражение, состоящее из цифр (0-9), латинских букв, трех знаков арифметических операций (+*/) и круглых скобок. Выражение является записанным верно и знак умножения (*) не опускается. Напишите программу, которая будет раскрывать скобки.
Входные данные: текстовая строка, содержащая арифметическое выражение, имеющее одну пару круглых скобок. Внутри круглой скобки должна быть ровно одна операция сложения.
Выходные данные: текстовая строка, содержащее арифметическое выражение тождественное введенному, но записанное без круглых скобок.
 
Тесты для проверки решений
 
Входные данные
Выходные данные
a*(b+c)
a*b+a*c
a*(b+c)/10
a*b/10+a*c/10
5+a*(b+c)
5+a*b+a*c
10*a*(b+c*2)+3/a
10*a*b+10*a*c*2+3/a
(3+с)/20*23
3/20*23+с/20*23
 
Указания к решению
 
Строковую запись арифметического выражения описанного в условии задачи можно представить в виде s1+s2(s3+s4)s5+s6, где s2, s3, s4, s5 не содержат знак операции сложения. Отметим, что любая часть выражения, кроме s3 и s4 может отсутствовать -  быть пустой строкой. Тогда искомая запись будет иметь следующий вид: s1+s2s3s5+s2s4s5+s6.
 
Приведем возможное решение на языке Паскаль:
 
program skobki;
 
Var
 
   s,s1,s2,s3,s4,s5,s6:string;
 
   i,j,k,l,m,n:integer;
 
Begin
 
     readln(s);
Ввод строки
     s1:='';
 
     s6:='';
 
     i:=pos('(',s)-1;
Ищем первый знак плюс слева от открывающей скобки. Все с начала строки по этот знак запишем в s1 и вырежем из s.
     if i>0 then begin
     j:=i;
     while (j>0) and (s[j]<>'+') do
           j:=j-1;
     s1:=copy(s,1,j);
     delete(s,1,j)
     end;
     i:=pos(')',s)+1;
Ищем первый знак плюс справа от закрывающей скобки. Все с его позиции и до конца строки запишем в s6 и вырежем из s.
     if (i<length(s)) and (i>2) then begin
      j:=i;
      while (j<=length(s)) and (s[j]<>'+') do
            j:=j+1;
      s6:=copy(s,j,length(s));
      delete(s,j,length(s))
      end;
 
      s2:=copy(s,1,pos('(',s)-1);
Найдем s2
      s5:=copy(s,pos(')',s)+1,length(s));
Найдем s5
      s3:=copy(s,pos('(',s)+1,pos(')',s)-pos('(',s)-1);
Запишем в s3 выражение в скобках
      s4:=copy(s3,pos('+',s3)+1,length(s3));
Найдем s4
      delete(s3,pos('+',s3),length(s3));
Уберем из s3 лишнее
      s:=s1+s2+s3+s5+'+'+s2+s4+s5+s6;
Найдем запись без скобок
writeln(s)
 
end.
 


С Новым Годом! (100 баллов)
 
          Скоро-скоро Новый Год! Поздравьте товарищей с наступающим 2013 годом! Напишите программу, которая будет проверять, кратна ли сумма цифр введенного четырехзначного числа сумме цифр наступающего года. Выведите на экран сумму цифр и, если условие выполняется, сообщение «NEW YEAR», в противном случае сообщение «OLD YEAR».
 
          Входные данные: положительное целое четырехзначное число.
          Выходные данные: сумма цифр введенного числа и одно из сообщений «NEW YEAR» или «OLD YEAR».
 
Тесты для проверки решений
 
Входные данные
Выходные данные
1005
6
«NEW YEAR»
2103
6
«NEW YEAR»
3300
6
«NEW YEAR»
3201
6
«NEW YEAR»
1221
6
«NEW YEAR»
1700
8
«OLD YEAR»
9012
12
«OLD YEAR»
8544
21
«OLD YEAR»
4214
11
«OLD YEAR»
2014
7
«OLD YEAR»
Указания к решению
Любым способом нужно найти сумму цифр четырехзначного числа и сравнить с числом 6. Рядом приведен фрагмент программы для поиска суммы цифр.
 
Readln(n);
K:=0;
For I:=1 to 4 do
Begin
K:=K+n mod 10:
N:=n div 10
End:

 

Пакет минут (100 баллов)
 
          У болтливой девочки Насти хитрый тарифный план мобильной связи. Каждый разговор обрабатывается по следующему правилу:
Первые 5 минут с начала каждого разговора из пакета списывается одна минута за одну минуту разговора, следующие 10 минут – 30 секунд за 1 минуту разговора, за следующие 10 минут к пакету добавляется 15 секунд за каждую минуту соединения, затем правило повторяется. Продолжительность разговора измеряется в секундах, а затем переводится в минуты. Если с начала последней минуты прошло меньше 5 секунд, она не учитывается, в противном случае считается как полная минута.
Напишите программу, которая будет считать, сколько минут осталось на счету у Насти.
Входные данные: вещественное число A – текущее количество минут в пакете, целое число N – количество обрабатываемых разговоров, Последовательность из N целых чисел соответствующих продолжительности каждого разговора в секундах.
Выходные данные: вещественное число А – количество оставшихся минут в пакете.
 
Тесты для проверки решений
 
Входные данные
Выходные данные
1300.00
3
125
3115
1300
1272.75
500
3
290
420
1000
479.50
200
1
501
193
333
3
67
140
543
321
250
2
5000
1221
212
 
Указания к решению
 
Следует отметить, что за каждые полные 25 минут разговора списывается 7,5 минут. Это можно использовать, что бы затем обрабатывать только интервалы меньше 25 минут.
Приведем возможное решение на языке Паскаль:
 
program tarif;
var
   A,x:real;
   N,k,i:integer;
begin
     readln(A);
     readln(N);
     for i:=1 to N do
     begin
          readln(k);
          if k mod 60 > 5 then k:=k div 60+1
                                       else k:=k div 60;
          A:=A-7.5*(k div 25);
          k:=k mod 25;
         if k > 5 then
begin  A:=A-5;  k:=k-5 end
else
begin A:=A-k; k:=0 end;
          if k > 10 then
                    begin A:=A-5; k:=k-10 end
          else
begin A:=A-k/2; k:=0 end;
         A:=A+k/4
         end;
     writeln(A:10:2)
end.
Copyright © 2005–2017 ХабЦНИТ ТОГУ Отправить письмо
Создание сайтов в Хабаровске