洛谷[普及]:P1149 [NOIP2008 提高组] 火柴棒等式

[NOIP2008 提高组] 火柴棒等式

感谢题目提供者CCF_NOI

题目描述

给你 n 根火柴棍,你可以拼出多少个形如 A+B=C 的等式?等式中的 A、B、C 是用火柴棍拼出的整数(若该数非零,则最高位不能是 0)。用火柴棍拼数字 0\sim9 的拼法如图所示:

注意:

1. 加号与等号各自需要两根火柴棍;
2. 如果 A\neq B,则 A+B=C 与 B+A=C 视为不同的等式(A,B,C\geq0);
3. $n$ 根火柴棍必须全部用上。

输入格式

一个整数 n(1 \leq n\leq 24)

输出格式

一个整数,能拼成的不同等式的数目。

样例 #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 中非常灵活且强大的工具,可以用于各种迭代和计数场景。

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值