📜  门| GATE-CS-2003 |问题 3(1)

📅  最后修改于: 2023-12-03 14:58:25.689000             🧑  作者: Mango

门 | GATE-CS-2003 | 问题 3

本题是GATE-CS-2003考试的第三道问题。该题是一道算法题,需要完成一个程序。

题目描述

在一个 $n$ 位数的数字中,有多少个数位是 1?

例如,对于数字 4711,有四个数位,其中有两个数位是 1,即个位和千位。

输入格式

输入一个整数 $n(1 \leq n \leq 10^9)$,表示数字的位数。

输出格式

输出一个整数,表示数字中有多少个数位是 1。

算法思路

首先,我们通过找规律可以发现:针对一个 $n$ 位数的数字,每个数位上出现 1 的次数相同,都是 $\frac{n-1}{10}+1$。

接下来,我们可以按照以下步骤求解:

  1. 将 $n$ 转换为字符串类型,并分割每一位数字。
  2. 遍历字符串中的每个数字,计算该数字上出现 1 的次数并累加。
  3. 返回累加结果。
代码实现

下面是 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