📌  相关文章
📜  范围内的数字计数,其中第一位数字等于数字的最后一位数字(1)

📅  最后修改于: 2023-12-03 15:11:50.027000             🧑  作者: Mango

题目介绍

本题要求你编写一个程序,统计一个给定范围内满足以下条件的数字数量:第一位数字等于数字的最后一位数字。

例如,在范围 [1,20] 内,满足条件的数字有:1、2、3、4、5、6、7、8、9 以及特别地,11。

算法思路

首先,我们需要确定给定范围内数字的最大值和最小值。也就是说,如果要统计 [100,150] 范围内符合条件的数字数量,我们需要把这个范围缩小到 [100,109],因为只有这些数字是以1开头的数字,符合我们的要求。

接下来,我们可以采用两种不同的方法来统计符合要求的数字数量。

第一种方法是针对每个在给定范围内的数字,判断其是否符合条件。具体来说,对于一个数字 n,我们可以通过以下方式来获取它的第一位数字和最后一位数字:

first_digit = n // (10 ** (len(str(n)) - 1))
last_digit = n % 10

其中,len(str(n)) 表示数字 n 的位数,// 表示整除运算符。

使用这种方法,我们需要遍历给定范围内的所有数字,判断它们是否满足条件,统计符合条件的数字数量。这个过程可以通过循环实现。

第二种方法是利用数学性质来解题。我们可以先统计给定范围内以每个数字作为第一位的数字数量,再乘以 10(因为最后一位数字可以是 0~9 中的任意一个数字)。这个过程可以通过以下方式实现:

n = 10
count = 0
while n <= max_num:
    first_digit = n // (10 ** (len(str(n)) - 1))
    count += last_digit_counts[first_digit]  # last_digit_counts 存储每个数字作为最后一位的数字数量
    n += 1
return count * 10

其中,last_digit_counts 是一个长度为 10 的列表,表示每个数字作为最后一位的数字数量。例如,last_digit_counts[0] 表示以数字 0 作为最后一位的数字数量。

在统计每个数字作为第一位的数字数量时,我们需要根据这个数字的长度来进行一些特殊处理。具体来说,如果数字长度为 1,那么它就是符合要求的数字;如果数字长度大于 1,那么我们需要把它缩小范围,如上文所述。

代码实现

下面是我把两种方法组合起来的完整代码实现。注意,这里的实现是针对 Python3 的。

def count_numbers_with_first_digit_equal_last_digit(min_num, max_num):
    # 计算每个数字作为最后一位的数字数量
    last_digit_counts = [1] * 10
    for i in range(2, 11):
        for j in range(10):
            last_digit_counts[j] += last_digit_counts[(j * 10 + j) % 10]  # 进行进位操作
    # 统计符合条件的数字数量
    count = 0
    for n in range(min_num, max_num + 1):
        if n % 10 == n // (10 ** (len(str(n)) - 1)):
            count += 1
    return count * 10 + sum(last_digit_counts[:-1]) * (max_num // 10)

其中,sum(last_digit_counts[:-1]) * (max_num // 10) 表示以 0~9 中的任意一个数字为第一位的数字数量之和,也就是上文所提到的“缩小范围”的部分。

总结

本题要求我们计算一个范围内满足一定条件的数字数量。我们可以采用两种不同的方法来解题,一种是通过遍历范围内的每个数字,判断它们是否符合条件;另一种是利用数学性质,计算出每个数字作为第一位的数字数量,再累加得到结果。

在实际编程实现中,我们可以结合两种方法,比如先计算出一个范围内以每个数字作为第一位的数字数量,再遍历这个范围内的数字进行判断。这样,可以减少判断的次数,加快程序的运行速度。