#P14074. 【循环2】塔子哥的数数题
-
ID: 1842
Tried: 786
Accepted: 278
Difficulty: 2
【循环2】塔子哥的数数题
题目描述:
给定一个正整数 n,你需要统计从 1 到 n 的所有整数中,满足以下条件的整数个数:对于每个整数 i,将 i 的各位数字相加的结果对 10 取模等于 i 的末尾数字。
具体来说,设 S(i) 为整数 i 的各位数字之和,d(i) 为整数 i 的末尾数字(即 imod10),我们需要满足以下条件:
S(i)mod10=d(i)请你计算出满足上述条件的整数的个数。
输入:
- 一行一个正整数 n (1≤n≤104)。
输出:
- 一行一个整数,表示满足条件的整数个数。
样例输入:
20
样例输出:
9
样例说明
- i=1: S(1)=1, d(1)=1, S(1)mod10=1 (符合)
- i=2: S(2)=2, d(2)=2, S(2)mod10=2 (符合)
- i=3: S(3)=3, d(3)=3, S(3)mod10=3 (符合)
- i=4: S(4)=4, d(4)=4, S(4)mod10=4 (符合)
- i=5: S(5)=5, d(5)=5, S(5)mod10=5 (符合)
- i=6: S(6)=6, d(6)=6, S(6)mod10=6 (符合)
- i=7: S(7)=7, d(7)=7, S(7)mod10=7 (符合)
- i=8: S(8)=8, d(8)=8, S(8)mod10=8 (符合)
- i=9: S(9)=9, d(9)=9, S(9)mod10=9 (符合)
- i=10: S(10)=1, d(10)=0, S(10)mod10=1 (不符合)
- i=11: S(11)=2, d(11)=1, S(11)mod10=2 (不符合)
- i=12: S(12)=3, d(12)=2, S(12)mod10=3 (不符合)
- i=13: S(13)=4, d(13)=3, S(13)mod10=4 (不符合)
- i=14: S(14)=5, d(14)=4, S(14)mod10=5 (不符合)
- i=15: S(15)=6, d(15)=5, S(15)mod10=6 (不符合)
- i=16: S(16)=7, d(16)=6, S(16)mod10=7 (不符合)
- i=17: S(17)=8, d(17)=7, S(17)mod10=8 (不符合)
- i=18: S(18)=9, d(18)=8, S(18)mod10=9 (不符合)
- i=19: S(19)=10, d(19)=9, S(19)mod10=0 (不符合)
- i=20: S(20)=2, d(20)=0, S(20)mod10=2 (不符合)
所以一共有9个
【循环2】塔子哥的数数题
前言
在正式讲解本题之前,先做一些知识补充:
- Python 的取模运算
- sum()函数
- 列表推导式
Python 的取模运算
基本的加减乘除运算就不做讲解了,主要讲解取模运算,因为 Python 的取模运算和数学意义上的取模运算在某些情况下有所不同。
Python 中的取模运算(%
)用于计算两个整数相除后的余数。其基本语法是:
a % b
其中,a
和 b
都是整数,a
是被除数,b
是除数。运算的结果是 a
除以 b
后的余数。
注意: Python 中的取模运算符 %
的结果符号与除数 b
相同。
取模运算的基本规则:
-
正数取模:如果
a
和b
都是正整数,那么a % b
就是a
除以b
后的余数。- 例如:
5 % 2 = 1
,因为 5 除以 2 商为 2,余数是 1。
- 例如:
-
负数取模:如果被除数
a
为负数,取模的结果符号将与除数b
相同。- 例如:
-5 % 2 = 1
,因为-5 = (-3)*2 + 1
。
- 例如:
-
除数为负数:当除数为负数时,取模的结果符号也会与除数相同。
- 例如:
5 % -2 = -1
,因为5 = (-2)*(-2) + (-1)
。
- 例如:
例子:
-
正数取模:
a = 10 b = 3 result = a % b # result = 1
-
负数取模:
a = -10 b = 3 result = a % b # result = 2
-
除数为负数:
a = 10 b = -3 result = a % b # result = -2
取模的应用:
-
判断一个数是否能被另一个数整除:使用
a % b == 0
可以判断a
是否能被b
整除。if a % b == 0: # a 能被 b 整除
-
循环结构中的应用:取模常常用于循环中,帮助进行循环的重置,比如圆形布局中的坐标限制等。
-
奇偶判断:通过
a % 2
判断一个数是否为偶数(a % 2 == 0
)或奇数(a % 2 != 0
)。if a % 2 == 0: print("偶数") else: print("奇数")
总的来说,取模运算是 Python 中常用的运算符,主要用于计算除法后的余数,广泛应用于很多算法和编程技巧中。
1. sum()
函数
Python 内置的 sum()
函数用于对可迭代对象中的元素进行求和。基本语法如下:
sum(iterable, start)
iterable
: 任何可迭代对象(如列表、元组、字符串等),其中的元素需要是数值类型。start
: 这个参数是可选的,用于指定累加的初始值,默认是0
。
举例:
sum([1, 2, 3]) # 输出 6
sum([1, 2, 3], 10) # 输出 16,因为 10 是起始值,1+2+3+10 = 16
在本题解法中,sum()
被用来计算一个整数的各位数字之和:
dig_sum = sum([int(x) for x in str(i)])
在这里,我们首先将整数 i
转换成字符串 str(i)
,然后使用列表推导式将字符串中的每个字符转换为整数,并计算它们的总和。
2. 列表推导式
列表推导式是 Python 中用于生成列表的一种简洁语法,它允许你基于已有的可迭代对象快速生成新的列表。
基本语法:
[expression for item in iterable]
expression
:用于生成每个元素的表达式。item
:从可迭代对象中提取的每一个元素。iterable
:待遍历的可迭代对象。
举例:
# 列表推导式生成 1 到 5 的平方数
squares = [x ** 2 for x in range(1, 6)] # 输出 [1, 4, 9, 16, 25]
在本题解法中,列表推导式被用于获取整数 i
各位数字的和:
[sum([int(x) for x in str(i)]) for i in range(1, n+1)]
str(i)
将整数i
转换为字符串;[int(x) for x in str(i)]
将字符串中的每个字符(即数字)转换为整数,并生成一个整数列表;sum(...)
计算该列表的和。
题解
题面描述
我们需要在 1
到 n
的范围内,统计满足以下条件的整数个数:一个整数 i
的各位数字之和 S(i)
对 10
取模后的结果等于该整数的末尾数字 d(i)
。即 S(i) % 10 = d(i)
。
输入描述
- 第一行输入一个整数
n
(1 ≤ n ≤ 1000
),表示需要遍历的整数范围上限。 - 不需要额外的输入。
输出描述
- 输出一个整数,表示满足条件的整数个数。
好的,我将逐步将代码思路与每一行对应的代码进行解释,以帮助你更清晰地理解每个步骤。
代码思路及对应代码
-
读取输入:
-
思路:首先,我们需要获取一个整数
n
,它表示我们需要遍历的整数范围的上限。这个值将用于决定我们遍历从1
到n
的每个整数。 -
对应代码:
n = int(input())
这行代码从标准输入读取一行并将其转换为整数,赋值给变量
n
。
-
-
初始化计数器:
-
思路:我们需要一个计数器
count
来记录满足题目条件的整数个数。初始值设为0
。 -
对应代码:
count = 0
这行代码初始化了计数器
count
,并将其设为0
。
-
-
遍历 1 到 n 的整数:
-
思路:我们需要遍历从 1 到
n
的每个整数,检查它是否满足条件:各位数字之和对 10 取模的结果等于该整数的末尾数字。 -
对应代码:
for i in range(1, n + 1):
这行代码使用
for
循环遍历从 1 到n
的每个整数。range(1, n + 1)
会生成一个包含 1 到n
的整数序列。
-
-
计算各位数字之和:
-
思路:我们通过将整数
i
转换为字符串,利用列表推导式获取每个字符并将其转换为整数,然后计算这些整数的和。这样可以得到i
各位数字之和。 -
对应代码:
dig_sum = sum([int(x) for x in str(i)])
str(i)
将整数i
转换为字符串。[int(x) for x in str(i)]
是列表推导式,它遍历字符串中的每个字符(每个字符就是数字),将字符转换为整数并存储在一个列表中。sum(...)
计算列表中所有数字的和,结果赋值给dig_sum
。
-
-
获取末尾数字并判断条件:
-
思路:我们需要获取整数
i
的末尾数字,并将dig_sum
对 10 取模后与末尾数字比较。如果两者相等,就说明该整数符合题目要求,计数器count
增加 1。 -
对应代码:
if i % 10 == dig_sum % 10: count += 1
i % 10
获取整数i
的末尾数字。dig_sum % 10
获取数字和dig_sum
对 10 取模后的结果。if i % 10 == dig_sum % 10:
检查两者是否相等,如果相等,说明该数字符合条件,计数器count
增加 1。
-
-
输出结果:
-
思路:遍历结束后,我们打印计数器
count
,它记录了满足条件的整数个数。 -
对应代码:
print(count)
这行代码输出最终满足条件的整数个数。
-
完整代码
# 读取正整数 n
n = int(input()) # 输入范围的上限 n
count = 0 # 初始化满足条件的整数计数
# 遍历从 1 到 n 的每个整数
for i in range(1, n + 1):
# 计算各位数字之和
dig_sum = sum([int(x) for x in str(i)])
# 获取末尾数字并判断条件
if i % 10 == dig_sum % 10:
count += 1 # 满足条件,计数加一
# 输出结果
print(count) # 输出满足条件的整数个数
解法2
print(sum([1 if i % 10 == sum([int(x) for x in str(i)]) % 10 else 0 for i in range(1 , int(input()) + 1)]))
解法1的压行版,大家不要刻意模仿,我们只是为了展现python的特效