[NOIP2008 提高组] 火柴棒等式
感谢题目提供者CCF_NOI
题目描述
给你 n 根火柴棍,你可以拼出多少个形如 A+B=C 的等式?等式中的 A、B、C 是用火柴棍拼出的整数(若该数非零,则最高位不能是 0)。用火柴棍拼数字 的拼法如图所示:
注意:
1. 加号与等号各自需要两根火柴棍;
2. 如果 ,则 与 视为不同的等式();
3. $n$ 根火柴棍必须全部用上。
输入格式
一个整数 。
输出格式
一个整数,能拼成的不同等式的数目。
样例 #1
样例输入 #1
14
样例输出 #1
2
样例 #2
样例输入 #2
18
样例输出 #2
9
提示
【输入输出样例 1 解释】
2 个等式为 0+1=1 和 1+0=1。
【输入输出样例 2 解释】
9 个等式为
0+4=4、0+11=11、1+10=11、2+2=4、2+7=9、4+0=4、7+2=9、10+1=11、11+0=11。
noip2008 提高第二题
题解
# 定义一个字典number,键是数字1到9,值是这些数字的"棒数"
number = {0:6,1:2,2:5,3:5,4:4,5:5,6:6,7:3,8:7,9:6}
# 定义一个字典num,键是棒数,值是对应棒数的数字列表,本人认为16(第三个数的最大棒数) = 24 - 4('+'跟'=') - 4(假如另两个都是2的话)
num = {2:[1],
3:[7],
4:[4],
5:[2,3,5],
6:[0,6,9],
7:[8],
8:[],
9:[],
10:[],
11:[],
12:[],
13:[],
14:[],
15:[],
16:[]
}
# 从用户输入获取一个整数n
n = int(input())
# 定义一个空列表tem,用于存储三位数的每一位数字
tem = []
# 定义一个集合count,用于存储满足条件的数字对
count = set()
# 遍历从10到1000的所有整数
for i in range(10,1001):
tem = list(str(i)) # 将当前整数i转换成字符串,然后转换成列表tem,存储每一位数字
stick = 0 # 将当前整数i转换成字符串,然后转换成列表tem,存储每一位数字
for _ in tem: # 遍历列表tem中的每一位数字
sticks += number[int(_)]
if stick <= 16: # 如果计算出的棒数不超过16,则继续
num[stick].append(i)
for i in range(2,17): # 遍历从2到16的整数,代表第一个加数的棒数的可能范围
for j in range(i,17): # 遍历从当前i到16的整数,代表第二个加数的棒数的可能范围
k = n - i - j - 4 # 计算第三个加数,这里减去4是因为题目要求三位数之和等于n
if k <= 17 and k >= 2: # 如果第三个加数在2到16之间,则继续
for i in num[i]: # 遍历第一个加数的可能值
for j in num[j]: # 遍历第二个加数的可能值
if i + j in num[k]: # 如果两个加数之和在num字典中对应第三个加数的列表中,则继续
if i != j:
count.add((i,j))
count.add((j,i))
else:
count.add((i,j))
# 打印集合count的长度,即满足条件的三位数组合的数量
print(len(count))
# print("len(count):",len(count))
# print("num:",num)
for i in range(10,1001):
range 是 Python 中的一个内置函数,用于生成一个整数序列。这个序列通常用于 for 循环中,作为迭代器来遍历一个固定的序列。下面是 range 函数的一些详细用法:
基本语法
range 函数的基本语法如下:
range(stop)
range(start, stop)
range(start, stop, step)
- start:序列的起始值,默认为 0。
- stop:序列的结束值,这个值不会包含在生成的序列中。
- step:步长,每次迭代增加的数值,默认为 1。
参数说明
- 如果只提供一个参数 stop,则序列从 0 开始,到 stop-1 结束。
- 如果提供两个参数 start 和 stop,则序列从 start 开始,到 stop-1 结束。
- 如果提供三个参数 start、stop 和 step,则序列从 start 开始,每次增加 step,直到 stop。
示例
1. 只提供结束值:
for i in range(5):
print(i)
输出:
0
1
2
3
4
这里生成了一个从 0 到 4 的序列。
2. 提供起始值和结束值:
for i in range(2, 7):
print(i)
输出:
2
3
4
5
6
这里生成了一个从 2 到 6 的序列。
3. 提供起始值、结束值和步长:
for i in range(0, 10, 2):
print(i)
输出:
0
2
4
6
8
这里生成了一个从 0 到 8 的序列,步长为 2。
负数步长
range 也支持负数步长,这在需要逆序迭代时非常有用:
for i in range(5, -1, -1):
print(i)
输出:
5
4
3
2
1
这里生成了一个从 5 到 1 的序列,步长为 -1。
空序列
如果 start 大于 stop(步长为正)或 start 小于 stop(步长为负),range 会生成一个空序列:
for i in range(10, 1):
print(i)
没有输出,因为生成的序列是空的。
与 for 循环结合使用
range 通常与 for 循环结合使用,以遍历一个序列:
for i in range(10, 1001):
# 这里的代码会执行多次,i 从 10 变化到 1000
在这个例子中,for 循环会执行 991 次,每次 i 的值从 10 递增到 1000。
range 是 Python 中非常灵活且强大的工具,可以用于各种迭代和计数场景。