📌  相关文章
📜  UGC-NET | UGC NET CS 2017年1月– II |问题8(1)

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

UGC-NET | UGC NET CS 2017年1月– II | 问题8

问题描述:编写一个程序,计算并输出从1到n的所有自然数中,每个数字出现的次数的和。

输入:一个整数n,1<=n<=10^6。

输出:一个整数,代表自然数1到n中每个数字出现的次数的和。

思路

遍历1到n的每个数字,将数字转换成字符串并遍历字符串中每个字符,统计每个字符出现的次数。最后将所有字符出现次数的和相加返回。

代码
def count_digits(n: int) -> int:
    digits_count = [0] * 10
    for i in range(1, n+1):
        for digit in str(i):
            digits_count[int(digit)] += 1
    return sum(digits_count)
解释

第1行定义了一个函数count_digits,它接收一个整数n作为输入,返回一个整数。

第2行初始化一个长度为10的列表digits_count,用于统计每个数字出现的次数。列表初始化为全0。

第3行到第6行对1到n的每个数字进行处理,遍历字符串表示的数字,并将每个数字的每个字符出现次数统计到digits_count中。

第7行返回所有数字出现的次数之和。

结论

上述程序计算自然数1到n中每个数字出现的次数的和。可以使用如下命令进行测试:

assert count_digits(0) == 0
assert count_digits(9) == 45
assert count_digits(10) == 55
assert count_digits(11) == 66
assert count_digits(111) == 321
assert count_digits(12345) == 66660