1.好数
问题描述
一个整数如果按从低位到高位的顺序,奇数位 (个位、百位、万位 ⋯⋯ ) 上的数字是奇数,偶数位 (十位、千位、十万位 ⋯⋯ ) 上的数字是偶数,我们就称之为 “好数”。
给定一个正整数 NN,请计算从 1 到 NN 一共有多少个好数。
样例输入
24
样例输出
7
样例说明
24 以内的好数有 1、3、5、7、9、21、23,一共 7个。
运行代码
n = int(input())
res = 0
for i in range(1, n + 1):
d = 1
while i > 0:
if i % 2 != d: #求余可得到个位数
break
i //= 10 #依次整除10可以依次得到十位、百位、千位...
d ^= 1 #^异或
res += i == 0 #作用是,如果 i == 0 为 True,则将 res 加 1。否则,res 不变
print(res)
代码解释
1.首先,我们接受一个正整数N作为输入。
2.初始化变量res为0,用于记录”好数"的个数。
3.使用for循环遍历从1到N的所有整数,并依次赋给i。
4.for循环中,初始化一个变量d=1,以此来表示奇数位
4.对于每个整数i,我们使用一个while循环来检查这个i是否为“好数”。
5.在for循环与while循环之间,我们初始化一个变量d=1,以此来表示奇数位(奇数%2==1)。
6.每次循环中,我们首先检查当前位置的数字是否和d相符(即奇数位是奇数,偶数位是偶数),如果不符合,则 break 退出循环,表示这个数字不是"好数"。
7.然后,我们将 i 整除 10,移到下一位数字。同时,我们用 d 异或 1 来切换到下一个位置(奇数位变偶数位,偶数位变奇数位)
8. n+=i==0原理:当i==0时说明已经到了最高位,能到达最高位说明i满足“好数”的要求。
补充:
d ^= 1 是一个很巧妙的操作,它用来交替处理奇数位和偶数位。
在这个代码中,d 是一个标志位,用来表示当前处理的是奇数位还是偶数位。
-
当 d 为 1 时,表示当前处理的是奇数位。
-
当 d 为 0 时,表示当前处理的是偶数位。
在每次循环中,我们先检查当前位置的数字是否满足条件,然后移到下一个位置。同时,我们需要切换到下一个位置的标志位。这时候,就可以使用 d ^= 1 这个操作来实现切换。