问题描述
一个整数如果由相同的数字构成,则称为完美整数。例如:
1、11、333是完美整数。12、19、101是不完美整数。
现在,你需要计算给定区间 [x, y] 中有多少个整数是完美整数。
问题解析
首先我们可以将区间[x, y]分解成两个区间[1, x-1]和[1, y]分别计算从1到x-1和从1到y1的完美整数个数,然后将两数相减就可以得到结果。
现在我们就将问题转换成求[1, n]区间内的完美整数个数问题。一个简单的方法是遍历区间内的每一个数,然后检查它是否是完美整数。然而,这种方法在区间范围较大时效率较低。其实不难发现n以内的完美整数个数是有规律可循的。
当n是一位数时,完美整数个数就是n。当n是多位数时,找到相同位数最小的完美整数是多少,用n除以它并取整,就能找到[1, n]内最多位的完美整数个数(显然,每个大区间内的完美整数个数都是9的倍数,比如[1, 10]是9个,[1, 100]是18个,[1, 10k]是9k个)。当n是两位数时,比如当n=13时,那区间[1, 13]内的完美整数个数就是9+1=10个(1,2,3,4,5,6,7,8,9,11)。当n=32时,那区间[1, 32]内的完美整数个数就是9+2=11个(1,2,3,4,5,6,7,8,9,11,22)。当n=55时,[1, 55]内的完美整数个数就是9+5=14个(1,2,3,4,5,6,7,8,9,11,22,33,44,55)。同样的当n是三位数时,也有这个规律。当n=313时,那区间[1, 313]内的完美整数个数就是92+2=20个。
不难看出这个规律:[1, n]区间内的完美整数个数=与n相等位数的最小整数n的区间内所有完美整数个数加上[n*, n]的完美整数个数,n可以取10k(k为整数)。所以公式应该是perfect_sum_count=9*k+n//(相同位数最小的完美整数)。
所以首先要有个函数计算[1, n]内的完美整数个数def count_perfect_integers(n),然后判断x是否为1,是则返回def count_perfect_integers(y),否则返回def count_perfect_integers(y)-def count_perfect_integers(x)。函数def count_perfect_integers(n)内首先字符串化数字n为n_str,n的位数就是n_str的长度,用一个for循环生成相同长度的最小完美整数用于求[n*, n]内的完美整数。
代码如下
def solution(x, y):
# Edit your code here
# 计算从[1,n]区间内的完美整数个数
def count_perfect_integers(n):
n_str = str(n)
max_digits = len(n_str)
perfect_num = 0
for i in range(max_digits):
perfect_num += 1 * (10 ** i)
count = 9 * (max_digits - 1) + n//perfect_num
return count
if x == 1:
return count_perfect_integers(y)
else:
return count_perfect_integers(y) - count_perfect_integers(x - 1)
if __name__ == "__main__":
# Add your test cases here
print(solution(1, 10) == 9)
print(solution(2, 22) == 10)