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