3869.统计区间内奇妙数的数目
难度:困难
问题描述:
给你两个整数l和r。
如果一个整数的数位形成一个严格单调序列,即数位是严格递增或严格递减的,那么这个整数被称为好数。所有一位数都被认为是好数。
如果一个整数是好数,或者它的数位和是好数,那么这个整数被称为奇妙数。
返回一个整数,表示在区间[l,r](包含边界)内的奇妙数的数量。
如果一个序列中的每个元素都严格大于其前一个元素(如果存在),则该序列被称为严格递增。
如果一个序列中的每个元素都严格小于其前一个元素(如果存在),则该序列被称为严格递减。
示例1:
输入:l=8,r=10
输出:3
解释:
8和9是一位数,所以它们是好数,因此也是奇妙数。
10的数位为[1,0],形成了一个严格递减的序列,所以10是好数,因此也是奇妙数。
因此,答案是3。
示例2:
输入:l=12340,r=12341
输出:1
解释:
12340
12340不是好数,因为[1,2,3,4,0]不是严格单调的。
数位和为1+2+3+4+0=10。
10是好数,因为它的数位为[1,0],是严格递减的。因此,12340是奇妙数。
12341
12341不是好数,因为[1,2,3,4,1]不是严格单调的。
数位和为1+2+3+4+1=11。
11不是好数,因为它的数位为[1,1],不是严格单调的。因此,12341不是奇妙数。
因此,答案是1。
示例3:
输入:l=123456788,r=123456788
输出:0
解释:
123456788不是好数,因为它的数位不是严格单调的。
数位和为1+2+3+4+5+6+7+8+8=44。
44不是好数,因为它的数位为[4,4],不是严格单调的。因此,123456788不是奇妙数。
因此,答案是0。
提示:
1<=l<=r<=10**15
问题分析:
解决这个问题分两步:
一是如何判断一个整数是一个奇妙数,要么组成这个数本身的各位数字是严格递增或严格递减的,也就是说是一个好数,或者组成这个数字的各位数字和是一个好数,那么这个数字就是一个奇妙数。程序设计了strictly_increasing(num)函数,用于判断一个整数的各位数字是否严格递增,进而设计 increasing_or_decreasing(num)函数判断一个整数是否严格递增或递减,最后设计函数judge_wonder_num(num),用于判断一个整数是否是一个奇妙数。
二是遍历由给定的l和r组成的区间[l,r]中的每个整数,检验是否为奇妙数,如果是奇妙数则计数,最后将统计出来的奇妙数数目输出,问题得到解决。
程序如下:
python
#判断一个整数的各位数字是否严格递增,如果是,返回True,否则返回False
def strictly_increasing(num):
num=str(num)
num=list(num)
n=len(num)
for i in range(1,n):
if num[i]<=num[i-1]:
return False
else:
return True
#判断一个整数的各位数字是否严格递增或递减,如果是,返回True,否则返回False
def increasing_or_decreasing(num):
t=int(str(num)[::-1])
return strictly_increasing(num) or strictly_increasing(t)
#判断一个整数是否为奇妙数,如果是,返回True,否则返回False
def judge_wonder_num(num):
t=str(num)
t=list(t)
t=list(int(i) for i in t)
s=sum(t)
return increasing_or_decreasing(num) or increasing_or_decreasing(s)
#主程序
l,r=eval(input('pls input l,r='))
c=0
print('奇妙数有:',end='')
for i in range(l,r+1):
if judge_wonder_num(i):
print(i,end=' ')
c+=1
print(',共有奇妙数',c,'个')
运行实例一
pls input l,r=891,900
奇妙数有:891 892 893 894 896 897 898 899 900 ,共有奇妙数 9 个
运行实例二
pls input l,r=12438,12439
奇妙数有:12438 12439 ,共有奇妙数 2 个