Образовательный портал Лицей №14
6. Выполнение и анализ простых алгоритмов
Задачи
- Автомат получает на вход трёхзначное число. По этому числу строится новое число по следующим правилам.
1. Складываются отдельно первая и вторая, а также вторая и третья цифры.
2. Полученные два числа записываются друг за другом в порядке неубывания без разделителей.
Пример. Исходное число: 872. Суммы: 8 + 7 = 15; 7 + 2 = 9. Результат: 915.
Укажите наименьшее число, при обработке которого автомат выдаёт
результат 812. [Я. Н. Зайдельман, М. А. Ройтберг, Информатика и ИКТ. Подготовка к ЕГЭ в 2019 году. Диагностические работы. ФГОС.— М.: МЦНМО, 2019., стр 9, №6]
Решение:
Результат работы автомата – это число составленное из сумм цифр исходного числа, записанные в порядке неубывания, следовательно 812 можно единственным образом разбить на две суммы 8 и 12. В каждой из этих сумм должно присутствовать одинаковое слагаемое.
8 = a + b = 1 + 7.
12 = b + c = 7 + 5.
Искомое число – 175.
Ответ: 175. - Автомат получает на вход четырёхзначное число (число не может начинаться с нуля). По этому числу строится новое число по следующим правилам.
1. Складываются отдельно первая и вторая, вторая и третья, третья
и четвёртая цифры заданного числа.
2. Наименьшая из полученных трёх сумм удаляется.
3. Оставшиеся две суммы записываются друг за другом в порядке неубывания без разделителей.
Пример. Исходное число: 1982. Суммы: 1 + 9 = 10, 9 + 8 = 17, 8 + 2 = 10.
Удаляется 10. Результат: 1017.
Укажите наибольшее число, при обработке которого автомат выдаёт
результат 613. [Я. Н. Зайдельман, М. А. Ройтберг, Информатика и ИКТ. Подготовка к ЕГЭ в 2019 году. Диагностические работы. ФГОС.— М.: МЦНМО, 2019. , стр 63, №6]
Решение:
Результат работы автомата – это число составленное из сумм цифр исходного числа, записанные в порядке неубывания, следовательно 613 можно единственным образом разбить на две суммы 6 и 13. В каждой из этих сумм должно присутствовать одинаковое слагаемое.
6 = a + b= 2 + 4.
13 = b + c= 9 + 4.
Искомое число – 9424.
Ответ: 9424 - Автомат обрабатывает натуральное трёхзначное число N по следующему алгоритму:
1. Из цифр, образующих десятичную запись N, строятся наибольшее и наименьшее возможные двузначные числа (числа не могут начинаться с нуля).
2. На экран выводится разность полученных двузначных чисел.
Пример. Дано число N = 238. Алгоритм работает следующим образом:
1. Наибольшее двузначное число из заданных цифр – 83, наименьшее – 23.
2. На экран выводится разность 83 – 23 = 60.
Чему равно наименьшее возможное трёхзначное число N, в результате обработки которого на экране автомата появится число 70? [Тренировочная работа №4 по информатике, 4 марта 2020 года, Вариант ИН1910401]
Решение:
Заметим, что числа, из которых строится разность – двузначные.
80 – 10 = 70, минимальное число, которое можно составить из цифр – 108.
Но если число 108 подать на вход автомата, то получим следующую разность:
81-10 = 71.
Поэтому 108 не удовлетворяет условию задачи.
81 – 11 = 70, минимальное число, которое можно составить из цифр – 118.
Ответ: 118 - На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом.
1) Строится двоичная запись числа N.
2) К этой записи дописываются справа ещё два разряда по следующему правилу:
а) складываются все цифры двоичной записи, и остаток от деления суммы на 2 дописывается в конец числа (справа). Например, запись 11100 преобразуется в запись 111001;
б) над этой записью производятся те же действия — справа дописывается остаток от деления суммы цифр на 2.
Полученная таким образом запись (в ней на два разряда больше, чем в записи исходного числа N) является двоичной записью искомого числа R.
Укажите минимальное число R, которое превышает 43 и может являться результатом работы алгоритма. В ответе это число запишите в десятичной системе. [Образовательный портал «Решу ЕГЭ», https://ege.sdamgia.ru/, №8094]
Решение:
Согласно условию задачи, если в числе было нечётное количество единиц, то в конец допишется 10. Если чётное, то 00. Таким образом, нужно найти первое число, большее 43, у которого в двоичной записи чётное количество единиц, а на конце 10 или 00. Имеем:
44 = 1011002 – не подходит, так как в двоичной записи числа содержится нечетное количество единиц.
45 = 1011012 – не может получиться в результате работы алгоритма, так как двоичная запись данного числа оканчивается на 01.
46 = 1011102 – удовлетворяет всем условиям.
Ответ: 46 - На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число следующим образом.
1) Строится двоичная запись числа N.
2) К этой записи дописываются справа ещё два разряда по следующему правилу: если N чётное, в конец числа (справа) дописываются два нуля, в противном случае справа дописываются две единицы. Например, двоичная запись 1001 числа 9 будет преобразована в 100111.
Полученная таким образом запись (в ней на два разряда больше, чем в записи исходного числа N) является двоичной записью числа — результата работы данного алгоритма.
Укажите минимальное число N, для которого результат работы алгоритма будет больше 134. В ответе это число запишите в десятичной системе счисления. [Образовательный портал «Решу ЕГЭ», https://ege.sdamgia.ru/, №8094]
Решение:
Заметим, что если число чётное, то в конец его двоичной записи добавляются цифры 00, а если нечётное — цифры 11.
Рассмотрим числа, большие 134, и найдем минимальное число, которое является результатом работы алгоритма.
135 = 100001112 — может являться результатом работы алгоритма.
Выполним обратное преобразование числа 135 согласно алгоритму:
100001112→ 1000012 → 33.
Получаем ответ — 33.
Ответ: 33 - На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число следующим образом.
1) Строится двоичная запись числа N.
2) К этой записи дописываются справа ещё два разряда по следующему правилу: если N чётное, в конец числа (справа) дописываются два нуля, в противном случае справа дописываются две единицы. Например, двоичная запись 1001 числа 9 будет преобразована в 100111.
Полученная таким образом запись (в ней на два разряда больше, чем в записи исходного числа N) является двоичной записью числа — результата работы данного алгоритма.
Укажите максимальное число N, для которого результат работы алгоритма будет меньше 134. В ответе это число запишите в десятичной системе счисления. [ЕГЭ — 2020. Досрочная волна. Вариант 2]
Решение:
Если число чётное, то в конец его двоичной записи добавляются цифры 00, а если нечётное — цифры 11.
Рассмотрим числа, меньшие 134, и найдем максимальное число, которое является результатом работы алгоритма.
133 =100001012 – не может являться результатом работы алгоритма, так как двоичная запись данного числа оканчивается на 01.
132 =100001002 – не может являться результатом работы алгоритма, так как если отбросить два последних разряда, то полученное число будет нечетным, а значит, согласно алгоритму к нему должно быть дописано 11, а не 00.
131 =100000112 – не может являться результатом работы алгоритма, так как если отбросить два последних разряда, то полученное число будет четным, а значит, согласно алгоритму к нему должно быть дописано 00, а не 11.
130 =100000102 – не может являться результатом работы алгоритма, так как двоичная запись данного числа оканчивается на 10.
129 =100000012 – не может являться результатом работы алгоритма, так как двоичная запись данного числа оканчивается на 01.
128 =100000002 – удовлетворяет всем условиям.
Выполним обратное преобразование числа 128 согласно алгоритму:
100000002→1000002 → 32.
Получаем ответ — 32.
Ответ: 32
Информационные источники
- «ФИПИ. Открытый банк тестовых заданий», http://os.fipi.ru/tasks/5/a
- Материалы для подготовки к ЕГЭ по информатике К.Ю. Полякова, http://kpolyakov.spb.ru/school/ege.htm
- Образовательный портал «Решу ЕГЭ», https://ege.sdamgia.ru/
- Я.Н.Зайдельман , ЕГЭ 2020. Информатика и ИКТ. Подготовка к ЕГЭ в 2020 году. Диагностические работы. ФГОС. — М.: МЦНМО, 2019.
- Я. Н. Зайдельман, М. А. Ройтберг, Информатика и ИКТ. Подготовка к ЕГЭ в 2019 году. Диагностические работы. ФГОС.— М.: МЦНМО, 2019.
ОГЭ Информатика Тест задание 16 Выполнение и анализ алгоритма для автомата
ОГЭ Информатика Тест задание 16 Выполнение и анализ алгоритма для автоматаПравильно | Ошибки | Пустые ответы |
---|---|---|
×
Подготовка к ОГЭ по Информатике
Задания на тему «Выполнение и анализ алгоритма для автомата».
Категория вопросов: Все категории задания Алгоритмы над цифрами числа Алгоритм над символами сообщения1) Дано четырехзначное десятичное число, в котором нет нечётных цифр (1, 3, 5, 7, 9). Из него строится новое число по следующим правилам:
- Вычисляются два числа — сумма двух крайних разрядов и сумма двух средних разрядов исходного числа;
- Полученные два числа записываются друг за другом в порядке убывания (без разделителей).
Пример. Исходное число: 2864. Поразрядные суммы: 6, 14. Результат: 146.
Определите, сколько из приведённых ниже чисел могут получиться в результате работы автомата:
224, 206, 1618, 12, 132, 124, 146, 158, 160.
Ваш ответ:
2) Автомат получает на вход два двузначных восьмеричных числа.
- Вычисляются два восьмеричных числа — сумма старших разрядов заданных чисел и сумма младших разрядов этих чисел;
- Полученные два восьмеричных числа записываются друг за другом в порядке возрастания (без разделителей).
Пример. Исходные числа: 668, 438. Поразрядные суммы: 12
Определите, сколько из приведённых ниже чисел могут получиться в результате работы автомата.
388 748 1128 11218 378 12148 10188
Ваш ответ:
- Вычисляются два шестнадцатеричных числа — сумма старших разрядов заданных чисел и сумма младших разрядов этих чисел;
- Полученные два шестнадцатеричных числа записываются друг за другом в порядке возрастания (без разделителей).
Пример. Исходные числа: 6616, 4316
Поразрядные суммы: A16, 916. Результат: 9A16
Определите, сколько из приведённых ниже чисел могут получиться в результате работы автомата.
96
Ваш ответ:
4) Автомат получает на вход трёхзначное число.
- Складываются первая и вторая, а также вторая и третья цифры исходного числа;
- Полученные два числа записываются друг за другом в порядке убывания (без разделителей).
Пример. Исходное число: 348. Суммы: 3 + 4 = 7; 4 + 8 = 12. Результат: 127.
Укажите наименьшее число, в результате обработки которого автомат выдаст число 43.
Ваш ответ:
5) Автомат получает на вход трёхзначное число. По этому числу строится новое число по следующим правилам:
- Складываются первая и вторая, а также вторая и третья цифры исходного числа;
- Полученные два числа записываются друг за другом в порядке убывания (без разделителей).
Пример. Исходное число: 348. Суммы: 3 + 4 = 7; 4 + 8 = 12. Результат: 127.
Укажите наименьшее число, в результате обработки которого автомат выдаст число 147.
Ваш ответ:
6) Автомат получает на вход трёхзначное число. По этому числу строится новое число по следующим правилам:
- Складываются первая и вторая, а также вторая и третья цифры исходного числа;
- Полученные два числа записываются друг за другом в порядке невозрастания (без разделителей).
Пример. Исходное число: 348. Суммы: 3 + 4 = 7; 4 + 8 = 12. Результат: 127.
Укажите наибольшее число, в результате обработки которого автомат выдаст число 134.
Ваш ответ:
7) Автомат получает на вход пятизначное десятичное число. По полученному числу строится новое десятичное число по следующим правилам:
- Вычисляются два числа — сумма первой, третьей и пятой цифр и сумма второй и четвертой цифр заданного числа;
- Полученные два числа записываются друг за другом в порядке невозрастания (без разделителей).
Пример. Исходное число: 15177. Поразрядные суммы: 9, 12. Результат: 129.
Определите, сколько из приведённых ниже чисел могут получиться в результате работы автомата.
1220, 120, 210, 2012, 1920, 2019, 212, 2919, 1929.
Ваш ответ:
8) Автомат получает на вход четырёхзначное десятичное число. По полученному числу строится новое десятичное число по следующим правилам:
- Вычисляются два числа – сумма четных цифр и сумма нечетных цифр заданного числа;
- Полученные два числа записываются друг за другом в порядке неубывания (без разделителей).
Пример. Исходное число: 2147. Сумма четных цифр — 6, сумма нечетных цифр — 8. Результат: 68.
Определите, сколько из приведённых ниже чисел могут получиться в результате работы автомата.
1416, 187, 320, 429, 40, 623, 23, 227, 1114.
Ваш ответ:
9) Автомат получает на вход трёхзначное десятичное число. По полученному числу строится новое десятичное число по следующим правилам:
- Вычисляются два числа – сумма старшего и среднего разрядов, а также сумма среднего и младшего разрядов заданного числа;
- Полученные два числа записываются друг за другом в порядке неубывания(без разделителей).
Пример. Исходное число: 348. Поразрядные суммы: 7, 12. Результат: 712.
Определите, сколько из приведённых ниже чисел могут получиться в результате работы автомата.
1719, 1917, 917, 317, 111, 1817, 1215, 716, 614, 222.
Ваш ответ:
10) Автомат получает на вход пятизначное десятичное число. По полученному числу строится новое десятичное число по следующим правилам.:
- Вычисляются два числа – сумма первых трёх цифр и сумма последних трёх цифр;
- Полученные два числа записываются друг за другом в порядке неубывания (без разделителей).
Пример. Исходное число: 15187. Поразрядные суммы: 7, 16. Результат: 716.
Определите, сколько из приведённых ниже чисел могут получиться в результате работы автомата.
2525, 724, 2520, 106, 2825, 2025, 625, 2528.
Ваш ответ:
11) Автомат получает на вход пятизначное десятичное число. По полученному числу строится новое десятичное число по следующим правилам.:
- Вычисляются два числа – сумма первых трёх цифр и сумма последних трёх цифр;
- Полученные два числа записываются друг за другом в порядке неубывания (без разделителей).
Пример. Исходное число: 25784. Поразрядные суммы: 14, 18. Результат: 1418.
Определите, сколько из приведённых ниже чисел могут получиться в результате работы автомата.
2828, 1023, 2518, 2524, 2425, 1825, 1225, 123 .
Ваш ответ:
12) Некоторый алгоритм из одной цепочки символов получает новую цепочку следующим образом. Если последняя буква в цепочке – гласная, то эта буква дописывается в начало цепочки, а если буква – согласная, то в конец цепочки. После чего последовательность символов в цепочке переворачивается в обратном порядке. Например, если исходной цепочкой было слово ЛЕС, то результатом работы алгоритма будет цепочка ССЕЛ, а если исходной цепочкой было слово ПОКА, то результатом работы алгоритма будет цепочка АКОПА.
Дана цепочка символов ОМАР. Какая цепочка символов получится, если к данной цепочке применить описанный алгоритм трижды (то есть применить алгоритм к данной цепочке, затем к результату вновь применить алгоритм, и ещё раз применить алгоритм к результату)?
Ваш ответ:
13) Император Гай Юлий Цезарь использовал специальный шифр для кодирования важных сообщений. Шифрование происходило следующий образом. Каждая буква исходного сообщения заменяется на другую букву, стоящую от данной на расстоянии сдвига. Значение сдвига определяет отправитель сообщения. Получатель также должен знать значение сдвига, чтобы декодировать сообщение.
Сдвиг может быть как отрицательным (букву сдиваем влево), так и положительным (букву сдвигаем вправо). Так например, если сдвиг равен 4, то буква А превращается в букву Д, а буква Ю — в букву В. Если сдвиг равен -3, то буква А превращается в букву Э, а буква П — в букву М. Данный шифр носит название в честь своего создателя.
Ваша задача применить данный шифр к слову «ЦЕЗАРЬ» со сдвигом -1. Затем перевернуть строку и применить вновь шифр Цезаря со сдвигом 4. В ответе укажите только результат.
Русский алфавит: АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
Ваш ответ:
14) Император Гай Юлий Цезарь использовал специальный шифр для кодирования важных сообщений. Шифрование происходило следующий образом. Каждая буква исходного сообщения заменяется на другую букву, стоящую от данной на расстоянии сдвига. Значение сдвига определяет отправитель сообщения. Получатель также должен знать значение сдвига, чтобы декодировать сообщение. Сдвиг может быть как отрицательным (букву сдиваем влево), так и положительным (букву сдвигаем вправо). Так например, если сдвиг равен 4, то буква А превращается в букву Д, а буква Ю — в букву В. Если сдвиг равен -3, то буква А превращается в букву Э, а буква П — в букву М. Данный шифр носит название в честь своего создателя.
Ваша задача применить данный шифр к слову «САЛАТ» со сдвигом 5. Затем перевернуть строку в обратном порядке и применить вновь шифр Цезаря со сдвигом 3. В ответе укажите только результат.
Русский алфавит: АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
Ваш ответ:
15) Император Гай Юлий Цезарь использовал специальный шифр для кодирования важных сообщений. Шифрование происходило следующий образом. Каждая буква исходного сообщения заменяется на другую букву, стоящую от данной на расстоянии сдвига. Значение сдвига определяет отправитель сообщения. Получатель также должен знать значение сдвига, чтобы декодировать сообщение.Сдвиг может быть как отрицательным (букву сдиваем влево), так и положительным (букву сдвигаем вправо). Так например, если сдвиг равен 4, то буква А превращается в букву Д, а буква Ю — в букву В. Если сдвиг равен -3, то буква А превращается в букву Э, а буква П — в букву М. Данный шифр носит название в честь своего создателя.
Ваша задача применить данный шифр к слову «ИКРА» со сдвигом -4. Затем перевернуть строку в обратном порядке и применить вновь шифр Цезаря со сдвигом 2. В ответе укажите только результат.
Русский алфавит: АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
Ваш ответ:
16) Император Гай Юлий Цезарь использовал специальный шифр для кодирования важных сообщений. Шифрование происходило следующий образом. Каждая буква исходного сообщения заменяется на другую букву, стоящую от данной на расстоянии сдвига. Значение сдвига определяет отправитель сообщения. Получатель также должен знать значение сдвига, чтобы декодировать сообщение. Сдвиг может быть как отрицательным (букву сдиваем влево), так и положительным (букву сдвигаем вправо). Так например, если сдвиг равен 4, то буква А превращается в букву Д, а буква Ю — в букву В. Если сдвиг равен -3, то буква А превращается в букву Э, а буква П — в букву М. Данный шифр носит название в честь своего создателя.
Данный шифр применили к слову «БАРРАКУДА» с неизвестным сдвигом. Полученное слово перевернули в обратном порядке и получили слово «ГЖЦНГУУГД». Укажите значение сдвига
Русский алфавит: АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
Ваш ответ:
17) Император Гай Юлий Цезарь использовал специальный шифр для кодирования важных сообщений. Шифрование происходило следующий образом. Каждая буква исходного сообщения заменяется на другую букву, стоящую от данной на расстоянии сдвига. Значение сдвига определяет отправитель сообщения. Получатель также должен знать значение сдвига, чтобы декодировать сообщение. Сдвиг может быть как отрицательным (букву сдиваем влево), так и положительным (букву сдвигаем вправо). Так например, если сдвиг равен 4, то буква А превращается в букву Д, а буква Ю — в букву В. Если сдвиг равен -3, то буква А превращается в букву Э, а буква П — в букву М. Шифр носит название в честь своего создателя.
Данный шифр применили к слову «ВОРОБЕЙ» с неизвестным сдвигом. Полученное слово перевернули в обратном порядке и получили слово «ЖВЮЛНЛЯ». Укажите значение сдвига.
Русский алфавит: АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
Ваш ответ:
python — Найдите 4-значное число, квадрат которого состоит из 8 цифр, а последние 4 цифры — исходное число
. Нам нужно проверить только 1 из 625 номеров-кандидатов.
Любое решение A:
upper_limit = 10**4 нижний_предел = интервал (10 ** 3,5) + 1 rem = нижний_предел % 625 если рем > 0: нижний_предел = нижний_предел - рем + 625 для n в xrange (lower_limit, upper_limit, 625): если n % 16 в [1, 15]: напечатать {1: n, 15: n+1}[n%16] перерыв
или Решение B:
печать (1 * (-39) * 16 + 0 * 1 * 625) % 10000
Прочтите объяснение.
Начиная с полного перебора списка, который проверяет всех кандидатов:
из math import ceil [n для n в xrange(ceil(10**3.5), 10000) if (n*n) % 10000 == n]
(Квадратный корень из 10**7
округляется до ближайшего целого числа).
(Обратите внимание, что 10000
— это первое число, квадрат которого состоит из 9 цифр, и цикл не будет проверять это число.)
… или если вы хотите завершить работу досрочно, как только найдете решение:
для n в xrange(ceil(10**3. 5), 10000): если (n*n) % 10000 == n: напечатать п перерыв
Но учтите: мы ищем числа n**2 - n = n*(n-1)
, которые делятся на 10**4 = 2**4 * 5**4
.
- либо
n
, либоn-1
нечетно; поэтому другой должен делиться на полные2**4 = 16
. Точно так же вы не можете иметь обаn
и(n-1)
делится на5
; - , поэтому нам нужно либо
n
, либо(n-1)
, чтобы оно делилось на5**4 = 625
. - , если любое из них (
n
или(n-1)
) делится на625
и16
, то это число делится на10000
. Никакое такое число не имеет четырех цифр, поэтому должно быть так, что либоn
, либо(n-1)
делится на625
, а другое делится на16
. - Таким образом, мы можем ограничить наше пространство поиска поиском только кратных
625
четырех цифр ; мы просто должны помнить, что кратное625
может быть либоn
, либо(n-1)
; другой должен делиться на16
.
Итак:
верхний_предел = 10**4 нижний_предел = потолок (10 ** 3,5) rem = нижний_предел % 625 если рем > 0: нижний_предел = нижний_предел - рем + 625 для n в xrange (lower_limit, upper_limit, 625): если (n-1)% 16 == 0: напечатать п перерыв если (n+1) % 16 == 0: напечатать n+1 перерыв
Или, если вы проверите n вместо (n-1) и объедините обе ветви условия в n % 16 в [1, 15]
, и для компактности вы можете напечатать {1: n, 15: n+ 1}[n%16]
.
Это решение А. (Кроме того, вы можете заменить n%16
на n & 0xf
, если хотите.)
Но подождите! На самом деле все это можно сделать с помощью…
Мы хотим найти n
такие, что либо: n = 0 (мод. 625)
и н - 1 = 0 (мод 16)
,
или: n - 1 = 0 (мод. 625)
и n = 0 (мод. 16)
.
Итак, в каждом случае у нас есть два уравнения с взаимно простыми модулями, решенные для одного и того же числа n
:
n = 0 (mod 625)
и n = 1 (mod 16)
,
или иначе n = 1 (мод. 625)
и n = 0 (мод. 16)
.
Теперь (в обоих случаях) мы будем использовать расширенный алгоритм Евклида, чтобы найти m1
и m2
такие, что 16*м1 + 625*м2 = 1
. Получается, что -39*16 + 1*625 = 1
, что приводит к Решению Б выше из второго случая. (Примечание: в первом случае вместо этого будет 625
, квадрат которого заканчивается на 0625
, но не считается решением.)
Для полноты картины приведем реализацию расширенного алгоритма Евклида. Второй и третий выходы м1
и м2
; в нашем случае 1
и -39
в некотором порядке.
по определению extended_gcd(a, b): last_remainder, остаток = абс (а), абс (б) х, last_x, у, last_y = 0, 1, 1, 0 в то время как остаток: last_remainder, (частное, остаток) = остаток, divmod(last_remainder, остаток) x, last_x = last_x - частное*x, x y, last_y = last_y - частное*y, y вернуть last_remainder, last_x * ((-1)**(a < 0)), last_y * ((-1)**(b < 0))
int — Как взять энную цифру числа в python
спросил
Изменено 1 месяц назад
Просмотрено 205 тысяч раз
Я хочу взять n-ю цифру из N-значного числа в python. Например:
номер = 9876543210 я = 4 number[i] # должно вернуть 6
Как я могу сделать что-то подобное в питоне? Должен ли я сначала изменить его на строку, а затем изменить его на int для расчета?
- питон
- целое число
2
Вы можете сделать это с помощью целочисленного деления и методов остатка
def get_digit(number, n): число возврата // 10**n % 10 получить_цифра (987654321, 0) № 1 получить_цифру (987654321, 5) № 6
//
выполняет целочисленное деление на степень десяти, чтобы переместить цифру в позицию единиц, затем %
получает остаток после деления на 10. Обратите внимание, что нумерация в этой схеме использует нулевой индекс и начинается с правой стороны номера.
4
Сначала обработайте число как строку
число = 9876543210 число = ул (число)
Затем, чтобы получить первую цифру:
число[0]
Четвертая цифра:
номер[3]
РЕДАКТИРОВАТЬ:
Это вернет цифру как символ, а не как число. Чтобы преобразовать его обратно, используйте:
int(number[0])
6
Меня заинтересовала относительная скорость двух популярных подходов — приведения к строке и использования модульной арифметики — поэтому я профилировал их и был удивлен, увидев, насколько они близки с точки зрения производительности.
(Мой вариант использования был немного другим, я хотел получить все цифры в числе.)
Строковый подход дал:
10000002 вызовов функций за 1,113 секунды Упорядочено: суммарное время ncalls tottime percall cumtime percall имя файла:lineno(функция) 10000000 1,113 0,000 1,113 0,000 sandbox.py:1(get_digits_str) 1 0,000 0,000 0,000 0,000 cProfile.py:133(__exit__) 1 0.000 0.000 0.000 0.000 {метод 'отключить' объектов '_lsprof.Profiler'} 928.Код, используемый для справки:
def get_digits_str(num): для n_str в строке (число): доходность int(n_str) def get_digits_mod (число, основание = 10): осталось = число выход оставшийся % системы счисления пока осталось := осталось // основание счисления: выход оставшийся % системы счисления если __name__ == '__main__': импорт cProfile импортировать случайный random_inputs = [random. randrange(0, 10**28) для _ в диапазоне(10**7)] с cProfile.Profile() как str_profiler: для rand_num в random_inputs: get_digits_str(rand_num) str_profiler.print_stats(sort='cumtime') с cProfile.Profile() как mod_profiler: для rand_num в random_inputs: get_digits_mod(rand_num) mod_profiler.print_stats (сорт = 'cumtime')Я бы рекомендовал добавить логическую проверку величины числа. Я конвертирую высокое значение миллисекунд в дату и время. У меня есть числа от 2 до 200 000 200, поэтому 0 является допустимым результатом. Функция, которую имеет @Chris Mueller, возвращает 0, даже если число меньше 10 ** n.
по определению get_digit (число, n): число возврата // 10**n % 10 получить_цифру (4231, 5) # 0по определению get_digit (число, n): если число - 10**n < 0: вернуть ложь число возврата // 10**n % 10 получить_цифру (4321, 5) # ЛОЖЬВы должны быть осторожны при проверке логического состояния этого возвращаемого значения. Чтобы разрешить 0 в качестве допустимого возвращаемого значения, вы не можете просто использовать
, если get_digit:
. Вы должны использовать, если get_digit имеет значение False:
, чтобы0
не вело себя как ложное значение.1
Мне очень жаль некропоточность, но я хотел предоставить решение без преобразования целого числа в строку. Также я хотел работать с более компьютерным мышлением, поэтому ответ Криса Мюллера был для меня недостаточно хорош.
Итак, без лишних слов,
импортировать математику определение count_number (число): счетчик = 0 counter_number = число в то время как counter_number > 0: counter_number //= 10 счетчик += 1 обратный счетчик def digit_selector (число, selected_digit, всего): total_counter = всего вычисляемый_выбор = общий_счетчик - выбранная_цифра number_selected = int (число / math.pow (10, вычисленный_выбор)) в то время как number_selected > 10: число_выбрано -= 10 вернуть number_selected деф основной(): х = 1548731588 total_digits = count_number(x) digit_2 = селектор_цифры (x, 2, total_digits) возврат печати (цифра_2) если __name__ == '__main__': основной(), который напечатает:
5Надеюсь, кому-то еще может понадобиться код такого типа. Хотелось бы и об этом отзыве!
Это должно найти любую цифру в целом числе.
Недостатки:
Работает неплохо, но если вы используете это для длинных чисел, то это будет занимать все больше и больше времени. Я думаю, что можно было бы увидеть, есть ли несколько тысяч и т. д., а затем вычесть их из number_selected, но это, возможно, в другой раз;)
Использование:
Вам нужны все строки с 1 по 21. Затем вы можете вызвать первый count_number, чтобы он подсчитал ваше целое число.
х = 1548731588 total_digits = count_number(x)Затем прочитайте/используйте функцию digit_selector следующим образом:
digit_selector('вставьте сюда ваше целое число', 'какую цифру вы хотите получить? (начиная с самой левой цифры как 1)', 'Сколько всего цифр?')
Если у нас есть 1234567890, и нам нужно выбрать 4, это 4-я цифра, считая слева, поэтому мы набираем «4».
Мы знаем, сколько там цифр, благодаря использованию total_digits. Так что это довольно легко.
Надеюсь, это все объясняет!
Han
PS: Отдельное спасибо CodeVsColor за предоставление функции count_number. Я использовал эту ссылку: https://www.codevscolor.com/count-number-digits-number-python, чтобы помочь мне заставить работать digit_selector.
Хорошо, прежде всего, используйте функцию str() в python, чтобы превратить «число» в строку
number = 9876543210 #объявление и присвоение число = строка (число) # преобразование 9" номер" индекс 3 или '6', если вам нравится в краткой форме
print(int(str(9876543210)[3])) #сокращенный код, лол, также больше нет переменной 'number'Арифметический подход для доступа к цифрам целого числа.
Исправлено ограничение Решение Криса Мюллера : если осуществляется доступ к цифре вне числового домена, результат всегда равен
0
:get_digit(12345, 10) # Крис Мюллер # 0Все, что нужно для исправления, это отследить позицию первой цифры.
Исходный вопрос относится к типу сортировки с прямым порядком байтов , но также включена реализация с прямым порядком байтов .
определение int_to_list(n:int) -> список[int]: если не н: возврат [0] n_цифр = 0 в то время как n >= 10**n_digits: n_цифр += 1 return [n // 10**i % 10 для i в диапазоне (n_digits)] # обратный порядок байтов #return [n // 10**i % 10 для i в диапазоне (n_digits-1, -1, -1)] # обратный порядок байтов х = 9876543210 print(int_to_list(x)) # порядок с обратным порядком байтов #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] печать (int_to_list (x) [4]) #4 печать (int_to_list (x) [20]) IndexError: индекс списка вне допустимого диапазонаВот мой взгляд на эту проблему.
Я определил функцию 'index', которая принимает число и входной индекс и выводит цифру с нужным индексом.
Метод enumerate работает со строками, поэтому число сначала преобразуется в строку. Поскольку индексация в Python начинается с нуля, но желаемая функциональность требует, чтобы она начиналась с 1, поэтому в функцию перечисления помещается 1, чтобы указать начало счетчика.
Leave A Comment