03 - 换钱组合【NS图】
本帖最后由 鱼C-小师妹 于 2021-3-26 10:41 编辑在线讲解:
https://www.bilibili.com/video/BV1HT4y1K7DY?p=5
学完上一讲,应该就对:
[*]循环三要素
[*]更加符合规范的 print
不陌生啦,这一讲我们通过一个换钱问题:
将 50 元的人民币兑换成 10 元、5 元和 1 元的钱币,共有多少种不同的兑换方法。
来学习 N-S 图,也被称为盒图或 NS 图。
是结构化编程中的一种可视化建模,比起前几讲的流程图,更加常用!
为何叫“N-S图”呢?
因为这是由 Nassi 和 Shneiderman 两位大佬发明滴,所以用他们名字首字母来命名。
越是复杂的程序结构,画成 N-S图就越好理解。
既然又叫盒图,就说明外观像个盒子,就像这样:
外层循环在最外面,内层循环在内部盒子中,以此类推~
我们就通过这个换钱的问题,来手把手带大家画下。
变量 x 代表 10 元的可能取值:
变量 y 代表 5 元的可能取值:
变量 z 代表 1 元的可能取值:
然后 x+y+z 总和要为 50 元,才可以输出。
来,我们开始画图~
range() 函数可创建一个整数列表,常常和 for 循环组合来用。
语法:
range(start, stop[, step])
参数说明:
[*]start: 计数从 start 开始。默认是从 0 开始。例如 range(5) 等价于 range(0,5),取值范围
[*]stop: 计数到 stop 结束,但不包括 stop。
[*]step:步长,默认为 1。例如:range(0,5,2),取值范围
很实用吧~
因为是相互嵌套,后一个值的取值范围,可以用总和 50 减去前一个值。
思路有了,我来带大家画 NS 图。
画好就是上面这张图啦:
上节课说过,如果想更加美观的输出换行,就添加一个 count 计数变量。
这里我们让一行有 3 个数据。
画出盒图后,是不是程序结构更加清晰啦。
这里将核心部分翻译成代码:
for x in range(0, 51, 10):
for y in range(0, 51-x, 5):
for z in range(0, 51-x-y, 1):
if(x + y + z == 50):
count += 1
if count % 3 == 0:
print("{}. ".format(count), end="")
print("10元{}张 5元{}张 1元{}张\t".format(x // 10, y // 5, z))
else:
print("{}. ".format(count), end="")
print("10元{}张 5元{}张 1元{}张\t".format(x //
10, y // 5, z), end=" ")
结果:
以后再遇到这种循环嵌套类型,只要画出盒图,程序也就搞定定咯~
好了,下课~
源码: k = 0
for x in range(6):
for y in range(11):
z = 50 - 10 * x - 5 * y
if z >= 0:
print(f'10: {x:^2},5: {y:^2},1: {z:^2}', end = ' ')
k += 1
if k % 3 == 0:
print()
print(f'共有{k}种换法')
count=0
for i in range(6):
for j in range(11):
if 10*i + 5*j<=50:
count+=1
z=50-(10*i + 5*j)
print("10元%d张,5元%d张,1元%d张"%(i,j,z))
print(count)
count=0
for m10 in range(0,6):
for m5 in range(0,12):
for m1 in range(0,51):
if(50==m10*10+m5*5+m1):
count+=1
print("m10=",m10,"m5=",m5,"m1=",m1)
print(count)
i = 0
for x in range(0,51,10):
for y in range(0,50-x +1 ,5):
for z in range(0,50-x-y + 1 ,1):
if x + y + z == 50:
i += 1
if i % 3 ==0:
print(f"{i}. ",end="")
print(f"共需要10元:{x//10}张,5元:{y//5}张,1元:{z}张\t")
else:
print(f"{i}. ",end="")
print(f"共需要10元:{x//10}张,5元:{y//5}张,1元:{z}张\t",end=" ")
print(f"一共有{i}种方法。")
# 题干:将 50 元的人民币兑换成 10 元、5 元和 1 元的钱币,共有多少种不同的兑换方法
# 10元的限制条件 i
# 5元的限制条件 j
# 1元的限制条件 k
# 价格限制 10*i + 5*j + k == 50
import time as t
class Mytimer:
def __init__(self, inputfun):
self.inputfun = inputfun
def cal(self):
self.timeleft = t.process_time()
self.inputfun()
self.timeright = t.process_time()
self.timeuse = self.timeright - self.timeleft
return '耗时%.5f秒' % self.timeuse
def initial():
count = 0
for i in range(0, 6):
for j in range(0, 11):
for k in range(0, 51):
if 10*i + 5*j + k == 50:
count += 1
# if count % 5 != 0:
# print('可换%d张10元,%d张5元,%d张1元' % (i, j, k), ' ' * 3, end='')
# else:
# print('可换%d张10元,%d张5元,%d张1元\n' % (i, j, k))
print('\n\n共有%d张兑换方法' % count)
def improve():
count = 0
for i in range(0, 6):
for j in range(0, 11):
k = 50 - 10*i - 5*j
if 0 <= k <= 50:
count += 1
# if count % 5 != 0:
# print('可换%d张10元,%d张5元,%d张1元' % (i, j, k), ' '*3, end='')
# else:
# print('可换%d张10元,%d张5元,%d张1元\n' % (i, j, k))
print('\n\n共有%d张兑换方法' % count)
t1 = Mytimer(initial)
print(t1.cal())
t2 = Mytimer(improve)
print(t2.cal()) {:5_109:}
#将50元的软妹币兑换成10元、5元和1元的钱币,
#一共有多少种不同的兑换方法呢?
n = 0
for x in range(0,51,10) :
for y in range(0,51-x,5):
for z in range(0,51-x-y,1):
if x+y+z == 50 :
n += 1
print("{},".format(n),end="")
print("10元{}张 5元{}张 1元{}张\t".format(x//10,y//5,z),end=" ")
if n % 3 == 0 :
print()
print("一共有{}种不同的兑换方法".format(n))
count = 0
for x in range(0,51,10):
for y in range(0,51,5):
for z in range(51):
if x+y+z == 50:
count +=1
if count%3 ==0:
print('{}.10元有{}张 5元有{}张 1元有{}张'.format(count,x//10,y//5,z))
else:
print('{}.10元有{}张 5元有{}张 1元有{}张'.format(count,x//10,y//5,z),end=' ')
print(count)
页:
[1]