Similar presentations:
10_Целочисленные алгоритмы
1. Алгоритмизация и программирование. Язык Python
§ 35. Целочисленные алгоритмы§ 36. Структуры
§ 37. Словари
§ 38. Стек, очередь, дек
§ 39. Деревья
§ 40. Графы
§ 41. Динамическое программирование
К.Ю. Поляков, Е.А. Ерёмин, 2021
http://kpolyakov.spb.ru
1
2. Алгоритмизация и программирование. Язык Python
2Алгоритмизация и
программирование.
Язык Python
§ 35. Целочисленные
алгоритмы
К.Ю. Поляков, Е.А. Ерёмин, 2021
http://kpolyakov.spb.ru
3. Решето Эратосфена
Алгоритмизация и программирование. Язык Python, 11 класс3
Решето Эратосфена
22 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Алгоритм:
1) начать с k = 2
Эратосфен Киренский
2) «выколоть» все числа через k, начиная с 2k··kk
(Eratosthenes, Ερατοσθδνη)
3) перейти к следующему «невыколотому» k
(ок. 275-194 до н.э.)
<=N N , то перейти к шагу 2
4) если kk·k<=
5) напечатать все числа, оставшиеся «невыколотыми»
Новая версия – решето Аткина.
? Как улучшить?
высокая скорость, количество операций
O((N·log N)·log log N )
нужно хранить в памяти все числа от 1 до N
К.Ю. Поляков, Е.А. Ерёмин, 2021
http://kpolyakov.spb.ru
4. Решето Эратосфена
Алгоритмизация и программирование. Язык Python, 11 класс4
Решето Эратосфена
Задача. Вывести все простые числа от 2 до N.
Массив (сначала все не вычеркнуты):
N = 100
выделяем на 1
элемент больше,
A = [True]*(N+1)
чтобы начать с A[1]
Вычёркивание непростых:
k=2
while k*k <= N:
if A[k]: # если k не вычеркнуто
i = k*k # начать c k*k
while i <= N: # вычеркнуть кратные k
A[i] = False
i += k
k += 1
К.Ю. Поляков, Е.А. Ерёмин, 2021
http://kpolyakov.spb.ru
5. Решето Эратосфена
Алгоритмизация и программирование. Язык Python, 11 класс5
Решето Эратосфена
или так:
from math import sqrt
for k in range(2, int(sqrt(N))+1):
if A[k]: # если k не вычеркнуто
for i in range(k*k, N, k)
k):
A[i] = False
все кратные k
К.Ю. Поляков, Е.А. Ерёмин, 2021
http://kpolyakov.spb.ru
6. Решето Эратосфена
Алгоритмизация и программирование. Язык Python, 11 класс6
Решето Эратосфена
Вывод результата:
for i in range(2,N+1):
if A[i]:
print ( i )
или так:
P = [ i for i in range(2,N+1)
if A[i] ]
print ( P )
выбираем те, которые
не вычеркнуты
К.Ю. Поляков, Е.А. Ерёмин, 2021
http://kpolyakov.spb.ru
7. «Длинные» числа
Алгоритмизация и программирование. Язык Python, 11 класс7
«Длинные» числа
Ключи для шифрования: 256 битов.
Целочисленные типы данных обычно 64 битов.
? Как хранить?
Длинное число – это число, которое не помещается в
переменную одного из стандартных типов данных
языка программирования.
«Длинная арифметика» – алгоритмы для работы с
длинными числами.
! В Python длинная арифметика встроенная!
К.Ю. Поляков, Е.А. Ерёмин, 2021
http://kpolyakov.spb.ru
8. «Длинные» числа
Алгоритмизация и программирование. Язык Python, 11 класс8
«Длинные» числа
A = 12345678
A
0
1
2
3
4
5
6
7
1
2
3
4
5
6
7
8
? Что плохо?
неудобно вычислять (с младшего разряда!)
неэкономное расходование памяти (одна цифра в
ячейке)
Обратный порядок элементов:
A
7
6
5
4
3
2
1
0
1
2
3
4
5
6
7
8
К.Ю. Поляков, Е.А. Ерёмин, 2021
http://kpolyakov.spb.ru
9. «Длинные» числа
Алгоритмизация и программирование. Язык Python, 11 класс9
«Длинные» числа
A = 12345678
Упаковка элементов:
A
2
1
0
12
345
678
12345678 = 12·10002 + 345·10001 + 678·10000
? На что похоже?
система счисления с
основанием 1000!
Если 4 байтовая ячейка:
от –231 = – 2 147 483 648 до 231 – 1 = 2 147 483 647.
? Какие основания можно использовать?
должны помещаться все
промежуточные результаты!
К.Ю. Поляков, Е.А. Ерёмин, 2021
http://kpolyakov.spb.ru
10. Вычисление факториала
Алгоритмизация и программирование. Язык Python, 11 класс10
Вычисление факториала
Задача 1. Вычислить точно значение факториала
100! = 1·2·3·…·99·100
? Как оценить количество цифр?
201 цифра
1·2·3·…·99·100 < 100100
основание 1000000
6 цифр в ячейке 34 ячейки
Основной алгоритм:
длинное
{A} = 1
число
for k in range(2,101):
{A} *= k
К.Ю. Поляков, Е.А. Ерёмин, 2021
http://kpolyakov.spb.ru
11. Вычисление факториала
Алгоритмизация и программирование. Язык Python, 11 класс11
Вычисление факториала
основание d = 1 000 000
[A] = 12345678901734567
A
3
2
1
0
0
12345
678901
734567
734 567·3 = 2 203 701
r = перенос в A[1]
*3
остаётся в A[0]
? Как найти перенос?
s = A[0]*k
A[0] = s % d
r = s // d
? Что изменится для A[1]?
К.Ю. Поляков, Е.А. Ерёмин, 2021
s = A[1]*k + r
http://kpolyakov.spb.ru
12. Вычисление факториала
Алгоритмизация и программирование. Язык Python, 11 класс12
Вычисление факториала
Умножение «длинного» числа на k:
r=0
все разряды
for i in range(len(A)):
s = A[i]*k + r
A[i] = s % d
r = s // d
число
if r > 0:
удлиняется
A.append ( r )
Вычисление 100!:
for k in range(2,101):
{A} *= k
К.Ю. Поляков, Е.А. Ерёмин, 2021
http://kpolyakov.spb.ru
13. Вывод длинного числа
Алгоритмизация и программирование. Язык Python, 11 класс13
Вывод длинного числа
A
3
2
1
0
0
1
2
3
? Какое число?
A = 1000002000003
• вывести старший ненулевой разряд
h = len ( A )- 1
print ( A[h], end = "" )
• вывести все следующие разряды, добавляя
лидирующие нули до 6 цифр
for i in range(h-1,-1,-1):
print ( f"{A[i]:06d}", end = "" )
дополнить
нулями
К.Ю. Поляков, Е.А. Ерёмин, 2021
в6
позициях
http://kpolyakov.spb.ru
14. Квадратный корень
Алгоритмизация и программирование. Язык Python, 11 класс14
Квадратный корень
Задача. Извлечь квадратный корень из «длинного»
целого числа; если это не целое число, найти корень с
округлением «вниз» (к меньшему значению).
x* a
x0 a
Метод Герона:
! Начальное приближение –
1
a
xi xi 1
2
xi 1
любое > 0!
a 16
x0 16
x1 0,5 16 16 / 16 8,5
x2 0,5 8,5 16 / 8,5 5,19
x3 0,5 5,19 16 / 5,19 4,14
...
К.Ю. Поляков, Е.А. Ерёмин, 2021
http://kpolyakov.spb.ru
15. Квадратный корень
Алгоритмизация и программирование. Язык Python, 11 класс15
Квадратный корень
Метод Герона в целых числах:
1
a
xi xi 1
x = (x + a // x)// 2
или так:
x = (x*x + a) // (2*x)
только целые
числа!
2
xi 1
xi2 1 a
xi
2 xi 1
? Когда остановиться?
это ответ!
x* a
x0 a
! Если следующее приближение больше
предыдущего, то стоп!
К.Ю. Поляков, Е.А. Ерёмин, 2021
http://kpolyakov.spb.ru
16. Квадратный корень
Алгоритмизация и программирование. Язык Python, 11 класс16
Квадратный корень
Метод Герона в целых числах:
def isqrt(a):
x = a # начальное приближение
while True:
следующее
приближение
x1 = (x*x + a)//(2*x)
if x1 >= x:
вернуть
return x
результат
x = x1
К.Ю. Поляков, Е.А. Ерёмин, 2021
http://kpolyakov.spb.ru
17. Задачи
Алгоритмизация и программирование. Язык Python, 11 класс17
Задачи
К.Ю. Поляков, Е.А. Ерёмин, 2021
http://kpolyakov.spb.ru
18. Задачи
Алгоритмизация и программирование. Язык Python, 11 класс18
Задачи
К.Ю. Поляков, Е.А. Ерёмин, 2021
http://kpolyakov.spb.ru
19. Конец фильма
Алгоритмизация и программирование. Язык Python, 11 класс19
Конец фильма
ПОЛЯКОВ Константин Юрьевич
д.т.н., учитель информатики
ГБОУ СОШ № 163, г. Санкт-Петербург
kpolyakov@mail.ru
ЕРЕМИН Евгений Александрович
к.ф.-м.н., доцент кафедры мультимедийной
дидактики и ИТО ПГГПУ, г. Пермь
eremin@pspu.ac.ru
К.Ю. Поляков, Е.А. Ерёмин, 2021
http://kpolyakov.spb.ru
20. Источники иллюстраций
Алгоритмизация и программирование. Язык Python, 11 класс20
Источники иллюстраций
1. wallpaperscraft.com
2. www.mujerhoy.com
3. www.pinterest.com
4. www.wayfair.com
5. www.zchocolat.com
6. www.russiantable.com
7. www.kursachworks.ru
8. ebay.com
9. centrgk.ru
10. www.riverstonellc.com
11. 53news.ru
12. 10hobby.ru
13. ru.wikipedia.org
14. иллюстрации художников издательства «Бином»
15. авторские материалы
К.Ю. Поляков, Е.А. Ерёмин, 2021
http://kpolyakov.spb.ru
programming