鱼C-小师妹 发表于 2021-3-13 21:19:03

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=" ")

结果:



以后再遇到这种循环嵌套类型,只要画出盒图,程序也就搞定定咯~

好了,下课~

源码:

zhangyuesd 发表于 2021-6-21 12:02:46

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}种换法')

mzxmzx 发表于 2021-7-6 20:31:59

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)

兔飞飞 发表于 2021-9-16 19:11:34

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)

傻眼貓咪 发表于 2021-10-17 19:16:19

specail 发表于 2021-10-23 18:02:43

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}种方法。")

Hyjxsssss 发表于 2022-5-3 19:08:12

# 题干:将 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())

hornwong 发表于 2022-5-8 00:17:49

{:5_109:}

bao1xf2 发表于 2022-5-15 22:45:59


#将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))

语与余 发表于 2022-11-13 21:27:26

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]
查看完整版本: 03 - 换钱组合【NS图】