📅  最后修改于: 2023-12-03 14:58:25.689000             🧑  作者: Mango
本题是GATE-CS-2003考试的第三道问题。该题是一道算法题,需要完成一个程序。
在一个 $n$ 位数的数字中,有多少个数位是 1?
例如,对于数字 4711,有四个数位,其中有两个数位是 1,即个位和千位。
输入一个整数 $n(1 \leq n \leq 10^9)$,表示数字的位数。
输出一个整数,表示数字中有多少个数位是 1。
首先,我们通过找规律可以发现:针对一个 $n$ 位数的数字,每个数位上出现 1 的次数相同,都是 $\frac{n-1}{10}+1$。
接下来,我们可以按照以下步骤求解:
下面是 Python 语言的实现代码。
def countOnes(n: int) -> int:
num_str = str(n)
num_len = len(num_str)
count = (num_len - 1) // 10 + 1
for i in range(num_len):
digit = int(num_str[i])
if digit == 0:
continue
if i == num_len - 1 and digit == 1:
# 如果是最高位并且最高位是 1,则需要特殊处理。
count += n % (10 ** i) + 1
elif digit == 1:
# 如果当前数字是 1,则需要特殊处理。
count += int(num_str[i + 1:]) + 1
else:
# 如果当前数字大于 1,则可以直接计算次数。
count += 10 ** (num_len - 1 - i) * digit // 10
return count
输入:
4711
输出:
2