如何计算两个整数之间的总数字位数?不同位数场景求解
解决思路:拆分区间+分阶段计算
核心逻辑是把位数不同的大区间拆分成多个位数相同的子区间,分别计算每个子区间的总位数后求和,具体步骤如下:
1. 统一区间顺序
先确保计算的起始数start ≤ 结束数end,如果输入的两个数顺序相反,先交换位置。
2. 拆分同位数子区间
找出从start的位数到end的位数之间的每一个位数等级(比如1位、2位、…、n位),对每个等级单独处理:
- 对于第k位的数,默认范围是
10^(k-1)到10^k - 1(比如1位是1-9,2位是10-99) - 结合实际的
start和end,确定当前子区间的实际边界:- 若当前位数等级是
start所在的等级,子区间起始为start,结束为min(10^k - 1, end) - 若当前位数等级是中间过渡等级,子区间直接用完整的
10^(k-1)到10^k - 1 - 若当前位数等级是
end所在的等级,子区间起始为10^(k-1),结束为end
- 若当前位数等级是
3. 计算每个子区间的总位数
每个子区间的总位数 = 位数k × 子区间内的整数个数(结束数 - 起始数 + 1)
4. 累加所有子区间结果
把每个子区间的计算结果相加,得到最终的总数字位数。
代码示例(Python)
def count_total_digits(start, end): # 统一区间顺序 if start > end: start, end = end, start total = 0 current = start # 获取数字的位数 def get_digit_count(num): if num == 0: return 1 count = 0 n = abs(num) # 兼容负数场景 while n > 0: count += 1 n = n // 10 return count current_digits = get_digit_count(current) end_digits = get_digit_count(end) while current_digits <= end_digits: max_num = 10 ** current_digits - 1 segment_end = min(max_num, end) # 累加当前子区间的总位数 total += current_digits * (segment_end - current + 1) # 切换到下一位数区间的起始 current = max_num + 1 current_digits += 1 return total # 测试示例:3到5698的总位数 print(count_total_digits(3, 5698))
额外说明
- 代码已兼容负数场景:负数的数字位数按其绝对值计算(比如-123的位数为3),如果需要把负号算一位,只需在
get_digit_count中对负数额外加1即可 - 单独处理了0的情况,确保0的位数为1
内容的提问来源于stack exchange,提问作者M.A.A
相关产品推荐
相关产品推荐

