1.奇数个数
题目:
计算0—7所能组成的
解析:
代码一:
假设范围为1-8位数的数字,假设sum=s=4是因为个位时只有1,3,5,7四个奇数,循环从两位数开始遍历:
当 j <= 2
时,执行 s *= 7
。是因为对于两位数的奇数,十位只有 7 种选择(因为 0 - 7 共 8 个数字,但首位不能为 0 )。
当 j > 2
时,执行 s *= 8
。因为从第三位数字开始,每多一位数字就多 8 种选择(因为这个时候在十位上放 0 - 7 都可以)。
代码二:
假设组成最大数为7777,逐一循环遍历
先判断每一个数字是不是由0-7组成,再判断是不是奇数
代码:
# 解法一
sum = 4
s = 4
for j in range(2,9):print(sum)if j <= 2:s *= 7else:s *= 8sum += s
print('sum = %d' % sum)
# 输出:
4
32
256
2048
16384
131072
1048576
sum = 8388608
# 解法二:
def count_odd_numbers():count = 0for i in range(1, 8000): # 0 - 7 组成的最大数为 7777num_str = str(i)all_valid = Truefor digit in num_str:if int(digit) not in range(8):all_valid = Falsebreakif all_valid:if int(num_str[-1]) % 2 == 1: # 检查个位是否为奇数count += 1return countprint(count_odd_numbers())
# 输出:
2048# 和解法二一样思路,换种写法
def count_odd_numbers():count = 0for i in range(1, 8000):num_str = str(i)digit_list = [int(d) for d in num_str]if all(d in range(8) for d in digit_list) and digit_list[-1] % 2 == 1:count += 1return countprint(count_odd_numbers())
2.求值
题目:
809*??=800*??+9*??+1 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果
解析:
这道题有一个迷惑点,就是809*??=800*??+9*??+1这个式子本身就是不可能成立的,所以这道题的关键点就是求出一个值同时满足8*??的结果为两位数,9*??的结果为3位数即可
代码:
for num in range(10, 100):if len(str(8 * num)) == 2 and len(str(9 * num)) == 3:print(f"??代表的两位数是:{num}")# 输出
??代表的两位数是:12
3.猴子分桃
题目:
海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
解析:
i代表第几个猴子,j代表每一份桃子数,x代表总的桃子数
while(i<5)代表,用i记录往回推的猴子数,从第0个到第4个是五个,只有当能推到第五个猴子也就是i=5时才退出while,否则j,也就是每一份的桃子数就会+1,一直加到满足条件
改变循环条件变量i的语句在for循环里面,因为每一次重新进行while循环就代表重新从第0个开始往回推,x=4*j是假设的最后剩下的,所以里面的for循环用来真正往回推,能被四整除代表能往回推因为剩下的是被分成五份后拿走了一份的,所以一定能被分成四份,不能就break,这个时候没有成功推回去5次,就会重新进行while循环,能就往前推,公式是x = (x / 4) * 5 + 1
代码:
i = 0
j = 1
x = 0
while (i < 5):x = 4 * jfor i in range(0, 5):if (x % 4 != 0):breakelse:i += 1x = (x / 4) * 5 + 1j += 1
print(x)
# 输出
3121.0
4.淘汰游戏
题目:
有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位
解析:
把所有人按顺序放入num列表中,如果num[i]=0代表已经退出圈子,k代表当前报到的数字,m代表退出圈子的人数,所以while循环的条件是只剩下最后一个人。num[i]!=0,代表这个位子的人还在,开始报数,报到3的时候退出去一个人,k=0从0重新开始报数,i=n代表遍历完所有人,重新开始遍历,最后输出num[i]不为0的人号数就是最后留下的
代码:
n = int(input('请输入总人数:'))
num = []
for i in range(n):num.append(i + 1)
i = 0 # 遍历所有人
k = 0 # 当前报的数
m = 0 # 退出圈子的人数
while m < n - 1:if num[i] != 0 : k += 1if k == 3:num[i] = 0 # 退出k = 0 # 重新报数m += 1i += 1if i == n : i = 0 # 遍历完所有人再重新遍历
i = 0
while num[i] == 0: i += 1
print(num[i])
5.分解质因子
题目:
编写一个程序,用于对一个数进行分解质因子
解析:
思路没什么大问题,就是注意会有重复因子,所以找到一个因子后要再重复判断还能不能再除这个因子,这里result是一个列表,str1+='*'.join(result)可以把列表用*连接并转换为字符串再和str1连接
代码:
n=int(input('please input n:'))
result=[]
i=2
str1=str(n)+'='
while n>1:if n%i==0:n/=iresult.append(str(i))i -= 1 # 重复因子i +=1
str1+='*'.join(result)
print(str1)