构造法--蓝桥杯

2022年(第⼗三届)省赛,填空题,lanqiaoOJ题号2141 【题⽬描述】这天⼩明正在学数数。他突然发现有些正整 数的形状像⼀座“⼭”,如123565321、145541,它们左右 对称(回⽂)且数位上的数字先单调不减,后单调不增。 ⼩明数了很久也没有数完,他想让你告诉他在[2022, 2022222022]中有多少个数的形状像⼀座“⼭” 。

如果直接判断[2022, 2022222022]内每个数是否为“⼭” 数,则⼀共需要判断20多亿次,计算量太⼤。此时可以 ⽤构造法构造出“⼭”数。由于“⼭”数是左右对称的回⽂ 数,所以只需构造“⼭”数的⼀半,另⼀半是这⼀半的翻 转,分为以下两种情况。

(1)“⼭”数的⻓度是偶数,左右对称,例如123321。在[20, 20222]内构造出“⼭”数的左边⼀半即可。虽然范围增加了,但是并没有增加新的回文数。

(2)“⼭”数的⻓度是奇数,中间数不⽐左右两边⼩,例如 1233321、1234321。这种“⼭”数的范围是[11111, 999999999],所以在[11, 9999]内构造左边部分即可。对 于下⾯第17⾏代码中的10−int(s[i+1]),例如构造了“⼭”数 左边部分s = 123,末尾是3,那么中间数可以是3~9,得 到“⼭”数1233321、1234321等,共10−3 = 7个“⼭”数。

Python

cnt=0
for i in range(20,20222):#偶数个时
	s=str(i)
	flag=1
	for j in range(len(s)-1):#注意边界条件,避免越界
		if(s[j]>s[j+1]):
			flag=0
			break
	if flag==1:
		cnt+=1

for i in range(11,10000):#奇数个时
	s=str(i)
	flag=1
	for j in range(len(s)-1):
		if(s[j]>s[j+1]):
			flag=0
			break
	if flag==1:
		cnt+=10-int(s[j+1])#因为中间的数还不确定,可以是从s[j+1]到 9中的一个
print(cnt)#3138

  • 12
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雾渐起

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值