qy_蓝桥杯编程系列_编程17 好数
编程17 好数 简析
这题写起来说难不难,只是我卡了好几次所以写一篇梳理下思路
一、 题目引入

如图所示的题目,看起来也并不复杂,从数字尾端作奇数位开始往前算,奇数位和偶数位相交替,个位是奇数位,十位就是偶数位,百位是奇数位以此类推。一个数字N的奇数位和偶数位上对应为奇数和偶数就算作一个好数,我们需要求从1开始到N的一共有多少个这样的数即可。我的思路是两个循坏搞定。
二、 解题
先输入整数N,定义计数变量
N = int(input())
count = 0 # 统计符合条件的数字个数
进入第一层循坏之后,首先需要单独设定代表当前数字的变量current,以免用该数字遍历时所作修改影响外层循环遍历,然后需要设定标志变量,用于更改奇数和偶数位状态、当前是否为好数
for num in range(1, N + 1):
current = num
target_parity = 1 # 判定当前是奇数位还是偶数位,1-奇数位,0-偶数位
is_good = 1 # 判定当前还是否为好数,1-好数,0-不是好数
然后对当前遍历的数字num进行判断,其奇数位和偶数位是否分别为奇数和偶数,用取余判断即可,循环整除以便确定这个数上的每一位
while current > 0:
digit = current % 10
current //= 10
# 若当前为奇数位
if target_parity == 1:
if digit % 2 != 1: # 奇数位上数字不为奇数时
is_good = 0 # 不是好数
break
# 若当前为偶数位
else:
if digit % 2 != 0: # 偶数位上不是偶数
is_good = 0 # 不是好数
break
# current经过整除来到上一位,奇偶数位改变,奇偶数位判定相应切换
target_parity = 1 - target_parity
第二层循环结束后可以根据is_good判断该数是否为好数
if is_good == 1:
count += 1
此题难点在逻辑梳理上,需要理清楚两个循环和两个标志变量的关系,放在合适的位置,否则可能出现过多冗余甚至错误。
Tips:完整代码
N = int(input())
count = 0 # 统计符合条件的数字个数
for num in range(1, N + 1):
current = num
target_parity = 1 # 判定当前是奇数位还是偶数位,1-奇数位,0-偶数位
is_good = 1 # 判定当前还是否为好数,1-好数,0-不是好数
while current > 0:
digit = current % 10
current //= 10
# 若当前为奇数位
if target_parity == 1:
if digit % 2 != 1: # 奇数位上数字不为奇数时
is_good = 0 # 不是好数
break
# 若当前为偶数位
else:
if digit % 2 != 0: # 偶数位上不是偶数
is_good = 0 # 不是好数
break
# current经过整除来到上一位,奇偶数位改变,奇偶数位判定相应切换
target_parity = 1 - target_parity
if is_good == 1:
count += 1
print(count)

浙公网安备 33010602011771号