___
Задачи действительно детские, но их трудно решать на том же pascal / basic / C.
#1. Условие: Написать функцию которая будет возвращать факториал числа N (0<=N<=100).
Проблема: Обычно на олимпиадах есть два языка: C (C++) и Pascal. В последнем тип integer занимает два байта (2^16), а значит можно получить только факториал числа N < 12.
Все просто, если есть Python:
- a, b = 0, 1
- N = raw_input()
- while N > 0:
- print b
- a, b = b, a + b
- N -= 1
- def sum (s1, s2):
- result, m = "", 0
- if len(s2) > len(s1): s1, s2 = s2, s1
- for i in range(len(s1)):
- m = m + int(s1[len(s1) - 1 - i]) + (int(s2[len(s2) - 1 - i]) if len(s2) > i else 0)
- result, m = str(m % 10) + result, m / 10
- return (str(m) if m > 0 else "") + result
- a, b = '0', '1'
- n = 100
- while n >= 0:
- print b
- a, b = b, sum(a, b)
- n -= 1
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. Для удобства, я написал функцию, которая возвращает последнее вхождение подстроки в строке:
- def lastIndexOf(string, substring):
- k, n = -1, string.find(substring)
- while n != -1: k, n = n, string.find(substring, n + 1)
- return k
- def main(n):
- n = str(n)
- lst = [] # Массив с индексами цифр
- for i in xrange(10):
- lst.append(lastIndexOf(n, str(i)))
- i, b = len(n), True
- while i > 0 and b:
- i -= 1;
- for t in xrange(int(n[i]), 10):
- if (i < lst[t]) and (int(n[i]) < t):
- # Формируем строку
- n = n[:i] + str(t) + n[0: lst[t] - i - 1] + n[i] + n[lst[t] + 1: len(n)]
- b = False; break
- # Отправляем результат
- return n
- print main(12800), main(12801), main(98745987)
#5. Последовательность P > 0 целых чисел называется jolly jumper, если абсолютные значения разностей последовательных элементов принимают все возможные значения от 1 до P - 1. К примеру, 1423 это jolly jumper, потому что абсолютные разности равны 3, 2 и 1 соответственно. Определение подразумевает, что любая последовательность из одного числа - это jolly jumper. Напишите программу, которая определяет, является ли каждая из введенных последовательностей jolly jumper. Входные данные: Каждая строка входных данных содержит число P < 3000, за которым следуют P целых чисел, представляющих собой последовательность. Выходные данные: Для каждой строки входных данных выведите строку, говорящую "Jolly" или "Not jolly"...
Читаем построчно файл, получаем числа, и просто проверяем результат:
- def isDigit(char):
- if char[0] in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']:
- return True
- else: return False
- file = open("D:\\OUTPUT.TXT", "w")
- for line in open("D:\\INPUT.TXT"):
- m = 0
- lst = []
- while m < len(line):
- # Получаем число
- k = ""
- while m < len(line) and isDigit(line[m]):
- k += line[m]; m += 1
- lst.append(k); m += 1
- # Смотрим дальше
- b, x = True, lst[1]
- for i in xrange(2, len(lst)):
- if abs(int(x) - int(lst[i])) >= int(lst[0]):
- b = False; break;
- x = int(lst[i])
- # Записываем результат
- file.write(("Jolly" if b else "Not jolly") + "\n")
- file.close()
Для любителей говорить правильно: єто есть єлементарно.