Вниз  Разбор интересных задач
- 12.08.2012 / 18:48
XakepPRO
  Модератор форума

XakepPRO 
Сейчас: Offline
Эй, ксапок, на твой Пост #215135 отвечу:
___

Задачи действительно детские, но их трудно решать на том же pascal / basic / C.

#1. Условие: Написать функцию которая будет возвращать факториал числа N (0<=N<=100).
Проблема: Обычно на олимпиадах есть два языка: C (C++) и Pascal. В последнем тип integer занимает два байта (2^16), а значит можно получить только факториал числа N < 12.
Все просто, если есть Python:
  1. a, b = 0, 1
  2. N = raw_input()
  3. while N > 0:
  4.     print b
  5.     a, b = b, a + b
  6.     N -= 1
Но сделаем функцию, которая будет складывать числа (в строках) методом столбика:
  1. def sum (s1, s2):
  2.     result, m = "", 0
  3.     if len(s2) > len(s1): s1, s2 = s2, s1
  4.     for i in range(len(s1)):
  5.         m = m + int(s1[len(s1) - 1 - i]) + (int(s2[len(s2) - 1 - i]) if len(s2) > i else 0)
  6.         result, m = str(m % 10) + result, m / 10
  7.     return (str(m) if m > 0 else "") + result
  8.  
  9. a, b = '0', '1'
  10. n = 100
  11. while n >= 0:
  12.     print b
  13.     a, b = b, sum(a, b)
  14.     n -= 1
:ps: Возможно, спасет longint (2^32), но я не проверял.


2#. Написать функцию "Сапер". В входном файле есть 2 числа М, N и матрица расположения бомб на карте. М и N - размерность матрицы. На выходе функция должна вывести на экран обработанную матрицу, на которой в каждой ячейке стоит цифра обозначающая количество рядом стоящих бомб. Пример:
Входной файл: 4
 4
 ....
 .*..
 *...
 ..*.
Вывод на экран обработанной вашей функцией матрицы:1110
2*10
*321
12*1
Проблема: Нет описания чисел M и N, поэтому читаем файл, определяем размеры, создаем массив, заполненный нулями. Снова читаем файл, получаем индексы "бомб", прибавляем единицы к индексам возле бомбы (ход короля, 9 клеток). Кстати, бобрософт тоже писал сапера =)

Открыть спойлер

#3. Нужно написать функцию, параметром которой является входное число N (где N>0). Параметр должен постоянно обрабатываться по принципу:
• Если число N - парное, то делить его на два. (N=N/2)
• Если число N - не парное, то умножать его на три и прибавить единицу (N=N*3+1)
В итоге функция должна выводить количество действий, произведенных над числом N.

Ну, опять-таки, можно попробовать решать все с помощью Python'a, но Pascal нам мешает. Возьмем функцию sum(string s1, string s2) (выше) и сделаем другую div(string s), которая делит число на 2 (нацело). Что-то вроде этого:
Открыть спойлер

#4. В входном файле есть НАТУРАЛЬНОЕ число, которое может уместить в себе до 1000000 цифр. Нужно написать функцию, которая в этом огромном числе переставит одну цифру так, что выйдет число больше чем данное, но меньшее из всех возможных чисел больших данного.

Идея проста: было число 12800, стало 18200; было - 12801, стало 12810; 987645987 - 987647985. Для удобства, я написал функцию, которая возвращает последнее вхождение подстроки в строке:
  1. def lastIndexOf(string, substring):
  2.     k, n = -1, string.find(substring)
  3.     while n != -1: k, n = n, string.find(substring, n + 1)
  4.     return k
  5.  
  6. def main(n):
  7.     n = str(n)
  8.  
  9.     lst = [] # Массив с индексами цифр
  10.     for i in xrange(10):
  11.         lst.append(lastIndexOf(n, str(i)))
  12.  
  13.     i, b = len(n), True
  14.     while i > 0 and b:
  15.         i -= 1;
  16.         for t in xrange(int(n[i]), 10):
  17.             if (i < lst[t]) and (int(n[i]) < t):
  18.                 # Формируем строку
  19.                 n = n[:i] + str(t) + n[0: lst[t] - i - 1] + n[i] + n[lst[t] + 1: len(n)]
  20.                 b = False; break
  21.     # Отправляем результат
  22.     return n
  23.  
  24. print main(12800), main(12801), main(98745987)
Выведет:18200  12801  98747985
#5. Последовательность P > 0 целых чисел называется jolly jumper, если абсолютные значения разностей последовательных элементов принимают все возможные значения от 1 до P - 1. К примеру, 1423 это jolly jumper, потому что абсолютные разности равны 3, 2 и 1 соответственно. Определение подразумевает, что любая последовательность из одного числа - это jolly jumper. Напишите программу, которая определяет, является ли каждая из введенных последовательностей jolly jumper. Входные данные: Каждая строка входных данных содержит число P < 3000, за которым следуют P целых чисел, представляющих собой последовательность. Выходные данные: Для каждой строки входных данных выведите строку, говорящую "Jolly" или "Not jolly"...

Читаем построчно файл, получаем числа, и просто проверяем результат:
  1. def isDigit(char):
  2.     if char[0] in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']:
  3.         return True
  4.     else: return False
  5.  
  6. file = open("D:\\OUTPUT.TXT", "w")
  7.  
  8. for line in open("D:\\INPUT.TXT"):
  9.     m = 0
  10.     lst = []
  11.     while m < len(line):
  12.         # Получаем число
  13.         k = ""
  14.         while m < len(line) and isDigit(line[m]):
  15.             k += line[m]; m += 1
  16.         lst.append(k); m += 1
  17.  
  18.     # Смотрим дальше
  19.     b, x = True, lst[1]
  20.     for i in xrange(2, len(lst)):
  21.         if abs(int(x) - int(lst[i])) >= int(lst[0]):
  22.             b = False; break;
  23.         x = int(lst[i])
  24.  
  25.     # Записываем результат
  26.     file.write(("Jolly" if b else "Not jolly") + "\n")
  27.  
  28. file.close()
_______________


Для любителей говорить правильно: єто есть єлементарно.
- 12.08.2012 / 18:49
JUST_EVIL
  Пользователь

JUST_EVIL 
Сейчас: Offline
XakepPRO, ну на бейскике точно запаристо
- 12.08.2012 / 19:49
XakepPRO
  Модератор форума

XakepPRO 
Сейчас: Offline
Прошу прощения, случайно перепутал числа Фибоначчи и факториал:
  1. # Python
  2. n, x, f = 100, 1, 1
  3. while n > 1:
  4.     x += 1
  5.     f *= x
  6.     n -=1
  7.     print f,
Google подтверждает, что результат равен 100! = 9.33262154 × 101^57. Расчет занимает меньше доли секунды.
- 12.08.2012 / 20:43
Singularity
  Пользователь

Singularity 
Сейчас: Offline
XakepPRO, на пятоне? О_О
- 12.08.2012 / 20:48
XakepPRO
  Модератор форума

XakepPRO 
Сейчас: Offline
Singularity, запросто. Я случайно забыл поставить условие выхода из цикла, так числа необыкновенные считает. Около.. 10^500..
- 27.10.2012 / 23:11
XakepPRO
  Модератор форума

XakepPRO 
Сейчас: Offline
Задача H. Необычный тир

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

Друзья Антона пригласили поиграть его в необычный тир. Мишень представляет собой бумажный листок 1x1 метр, а снаряды – шарики с краской. Снаряд, попадая в мишень, взрывается и оставляет след в виде круга определѐнного радиуса. Часть круга может находиться вне мишени. Антон и его друзья по очереди стреляют
каждый в свою мишень, и после всех совершѐнных выстрелов смотрится, у кого из участников процент поражения максимален. Процент поражения — это отношение площади окрашенной зоны, к площади мишени. Антон совершил свои выстрелы. Вам нужно найти процент поражения.

Формат входных данных
На вход программе подается число N – число выстрелов (1≤N≤10). В следующих N строках находятся по три действительных числа x, y, r (0≤x,y,r≤1) – координаты точки попадания снаряда и радиус его поражения в метрах. Считается, что координата левого нижнего угла мишени — (0;0).

Формат выходных данных
Выведите единственное действительное число – процент поражения мишени. Ответ должен быть дан с точностью не менее одной десятой процента.

Примеры
  1. Пример ввода
  2. 1
  3. 0.5 0.5 0.5
  1. Пример вывода
  2. 78.5


  1. 2
  2. 0.2 0.2 0.5
  3. 0.8 0.8 0.5
  1. 80.7

- 28.10.2012 / 00:18
Maxxxl123
  Пользователь

Maxxxl123 
Сейчас: Offline
Хотел бы спросить как прорисовать на екране ПРАВЕЛЬНЫЙ n угольник, формулу для вычитления следуйщей точки подкинте, и код, желательно на java or pascal
- 28.10.2012 / 00:21
XakepPRO
  Модератор форума

XakepPRO 
Сейчас: Offline
Maxxxl123, завтра этим займусь.
- 28.10.2012 / 10:07
XakepPRO
  Модератор форума

XakepPRO 
Сейчас: Offline
Задача E. Не упадѐт!

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

Антон играет в игру «Не упадѐт!». В этой игре нужно строить башню из кубиков и цилиндров. Антон заметил, что если ставить хотя бы 2 цилиндра друг на друга, то башенка неминуемо падает, а во всех других случаях — держится. У Антона есть неограниченное количество кубиков и цилиндров — помогите ему узнать, сколько различных устойчивых башенок высоты H он сможет построить.

  1. Формат входных данных
  2. На вход программе подается одно число, высота башни — H (2≤H≤1000).
  1. Формат выходных данных
  2. Выведите количество способов построить башню высоты H из кубиков и цилиндров.


Изменено XakepPRO (28.10 / 10:08) (всего 1 раз)
- 28.10.2012 / 11:22
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
Maxxxl123, в правильном N-угольнике каждый угол отстоит от другого на (360 / N) градусов (например для квадрата, это 90 градусов). Чтобы найти точку нужно длину (радиус) умножить на косинус (для x) или синус (для y) угла. Вот код на паскале.
  1. procedure drawPolygone;
  2. const ANGLES = 7;
  3. var points : array[1..ANGLES+1] of PointType;
  4.     angle, len: integer;
  5. begin
  6.    angle := 0;
  7.    i := 1;
  8.    len := GetMaxY div 2;
  9.    while (angle < 360) do begin
  10.      points[i].X := GetMaxX div 2 + round(len * cos(angle * PI / 180));
  11.      points[i].Y := GetMaxY div 2 + round(len * sin(angle * PI / 180));
  12.      angle := angle + (360 div (ANGLES));
  13.      inc(i);
  14.    end;
  15.    SetColor(DARKGRAY);
  16.    FillPoly(ANGLES, points)
  17. end;

__________________
 let live

Изменено aNNiMON (28.10 / 11:25) (всего 1 раз)
Наверх  Всего сообщений: 751
Фильтровать сообщения
Поиск по теме
Файлы топика (34)