一、怎么获取一个数的每一位
例子:输入:12306
输出:[1, 2, 3, 0, 6]
num = input()
result = [int(x) for x in str(num)]
print(result)
例题扩展一、按位运算
给定一个数字,按位处理,将奇数位数字相加,偶数位数字相乘,最后输出这两个结果。
import math
num = input()
odd = []
even = []
for i,v in enumerate(num):
if i % 2 == 1:
even.append(int(v))
else:
odd.append(int(v))
odd = sum(odd)
even = math.prod(even)
print(odd)
print(even)
例题扩展二、数字排列
输入一个数字,将其每一位数字取出后,并找出其中最大的数。
示例:输入:15976
输出:97651
from itertools import permutations
num = input()
# 将数字的每一位转换为整数列表
digits = [int(digit) for digit in num]
# 生成所有可能的排列
perms = permutations(digits)
max_num = 0
for perm in perms:
# 将排列转换为整数
current_num = int(''.join(map(str, perm)))
if current_num > max_num:
max_num = current_num
print(max_num)
方法二:
num = input()
result = ''
a = map(int, ','.join(num.split()))
ss = sorted(a, reverse=True)
for i in ss:
result += str(i)
print(result)
二、计算数的二进制、八进制、十六进制
内置函数实现:
decimal_num = 255
# 转换为二进制
binary_num = bin(decimal_num)
print(f"二进制: {binary_num}")
# 转换为八进制
octal_num = oct(decimal_num)
print(f"八进制: {octal_num}")
# 转换为十六进制
hexadecimal_num = hex(decimal_num)
print(f"十六进制: {hexadecimal_num}")
特别注意:使用 x
或 X
作为格式说明符可以将十进制数转换为十六进制字符串,x
生成的十六进制字符为小写,X
生成的为大写。
代码中,format(decimal_num, 'x')
会将 decimal_num
转换为小写的十六进制字符串,format(decimal_num, 'X')
则会转换为大写的十六进制字符串,并且都不会添加 0x
前缀。
decimal_num = 255
binary_num = format(decimal_num, 'b')
print(f"二进制: {binary_num}")
octal_num = format(decimal_num, 'o')
print(f"八进制: {octal_num}")
hexadecimal_num_lower = format(decimal_num, 'x')
hexadecimal_num_upper = format(decimal_num, 'X')
print(f"十六进制(小写): {hexadecimal_num_lower}")
print(f"十六进制(大写): {hexadecimal_num_upper}")
例题扩展一、字母数
请找到一个大于 2022 的最小数,这个数转换成十六进制之后,所有的数位(不含前导 00)都为字母(AA 到 FF)。请将这个数的十进制形式作为答案提交。
num = 2022
while True:
num += 1
result = format(num,'x')
if result.isalpha():
print(int(result,base=16))
break
例题扩展二、进制转换
- 输入一个十进制整数(可能为负数)。
- 将其转换为二进制、八进制、十六进制。
- 输出格式要求:
- 二进制:补前导零至 8 位,不带
0b
前缀。 - 八进制:不带
0o
前缀。 - 十六进制:使用大写字母,不带
0x
前缀。
- 二进制:补前导零至 8 位,不带
示例:
请输入一个十进制整数:-25
二进制:-00011001
八进制:-31
十六进制:-19
num = int(input())
two = format(num,'b')
eight = format(num,'o')
sixteen = format(num,'x')
print(two)
print(eight)
print(sixteen)
三、怎么循环日期?
from datetime import date, timedelta
start_date = date(1900, 1, 1)
end_date = date(9999, 12, 31)
while start_date < end_date:
current_time = start_date
print(current_time)
start_date += timedelta(days=1)
例题扩展一、特殊日期
对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的各位数字之和。请问从 1900 年 11 月 11 日至 9999 年 12 月 31 日,总共有多少天,年份的数位数字之和等于月的数位数字之和加日的数位数字之和。例如,2022 年 11 月 13 日满足要求,因为 2+0+2+2=(1+1)+(1+3)。请提交满足条件的日期的总数量。
from datetime import date, timedelta
start_date = date(1900, 1, 1)
end_date = date(9999, 12, 31)
count = 0
while start_date < end_date:
current_time = start_date
dit_year = [int(x) for x in str(current_time.year)]
dit_month = [int(x) for x in str(current_time.month)]
dit_day = [int(x) for x in str(current_time.day)]
if sum(dit_year) == sum(dit_month) + sum(dit_day):
count += 1
start_date += timedelta(days=1)
print(count)
四、排列组合问题
排列
排列指的是从 n
个不同元素里取出 m
(m ≤ n
)个元素,按照一定顺序排成一列。itertools.permutations
函数可用来生成指定可迭代对象的所有排列。
import itertools
# 定义一个列表
numbers = [1, 2, 3]
# 生成列表中所有元素的长度为 2 的排列
permutations = itertools.permutations(numbers, 2)
# 遍历并打印所有排列
for perm in permutations:
print(perm)
组合
组合是从 n
个不同元素中取出 m
(m ≤ n
)个元素组成一组,不考虑元素的顺序。itertools.combinations
函数可用于生成指定可迭代对象的所有组合。
import itertools
# 定义一个列表
numbers = [1, 2, 3]
# 生成列表中所有元素的长度为 2 的组合
combinations = itertools.combinations(numbers, 2)
# 遍历并打印所有组合
for comb in combinations:
print(comb)
例题扩展一、大乘积
小蓝有 30 个数,分别为:99, 22, 51, 63, 72, 61, 20, 88, 40, 21, 63, 30, 11, 18, 99, 12, 93, 16, 7, 53, 64, 9, 28, 84, 34, 96, 52, 82, 51, 77 。
小蓝可以在这些数中取出两个序号不同的数,共有 30×29/2=435 种取法。
请问这 435 种取法中,有多少种取法取出的两个数的乘积大于等于 2022 。
from itertools import combinations
import math
lst = [99, 22, 51, 63, 72, 61, 20, 88, 40, 21, 63, 30, 11,
18, 99, 12, 93, 16, 7, 53, 64, 9, 28, 84, 34, 96, 52, 82, 51, 77]
count = 0
for i in combinations(lst, 2):
result = math.prod(i)
if result > 2022:
count += 1
print(count)
评论区