鱼C论坛

 找回密码
 立即注册
查看: 7448|回复: 9

[技术交流] 03 - 换钱组合【NS图】

[复制链接]
发表于 2021-3-13 21:19:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 鱼C-小师妹 于 2021-3-26 10:41 编辑

在线讲解:



学完上一讲,应该就对:

  • 循环三要素
  • 更加符合规范的 print

不陌生啦,这一讲我们通过一个换钱问题:

将 50 元的人民币兑换成 10 元、5 元和 1 元的钱币,共有多少种不同的兑换方法。

来学习 N-S 图,也被称为盒图或 NS 图。

是结构化编程中的一种可视化建模,比起前几讲的流程图,更加常用!

为何叫“N-S图”呢?

因为这是由 Nassi 和 Shneiderman 两位大佬发明滴,所以用他们名字首字母来命名。

越是复杂的程序结构,画成 N-S图就越好理解。

既然又叫盒图,就说明外观像个盒子,就像这样:

盒图.jpg

外层循环在最外面,内层循环在内部盒子中,以此类推~

我们就通过这个换钱的问题,来手把手带大家画下。

变量 x 代表 10 元的可能取值:[0,10,20,30,40,50]

变量 y 代表 5 元的可能取值:[0,5,10,15,20,25,30,35,40,45,50]

变量 z 代表 1 元的可能取值:[0,1,2,...,50]

然后 x+y+z 总和要为 50 元,才可以输出。

来,我们开始画图~

range() 函数可创建一个整数列表,常常和 for 循环组合来用。

语法:
range(start, stop[, step])
参数说明:

  • start: 计数从 start 开始。默认是从 0 开始。例如 range(5) 等价于 range(0,5),取值范围 [0,1,2,3,4]
  • stop: 计数到 stop 结束,但不包括 stop。
  • step:步长,默认为 1。例如:range(0,5,2),取值范围 [0,2,4]

很实用吧~

因为是相互嵌套,后一个值的取值范围,可以用总和 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=" ")
结果:

2021-03-18_15-34-26.jpg

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

好了,下课~

源码: changeCoin.py.zip (861 Bytes, 下载次数: 19, 售价: 6 鱼币)

评分

参与人数 1荣誉 +5 鱼币 +3 贡献 +3 收起 理由
睦ちゃん她爹 + 5 + 3 + 3 鱼C有你更精彩^_^

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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}种换法')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-17 19:16:19 | 显示全部楼层
[print(f"{a}张十元,{b}张五元,{c}张一元") for a in range(6) for b in range(10) for c in range(50) if a*10 + b*5 + c == 50]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 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}种方法。")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-3 19:08:12 | 显示全部楼层
# 题干:将 50 元的人民币兑换成 10 元、5 元和 1 元的钱币,共有多少种不同的兑换方法

# 10元的限制条件 [0, 5]   i
# 5元的限制条件 [0, 10]   j
# 1元的限制条件 [0, 50]   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())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-8 00:17:49 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 14:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表