鱼C论坛

 找回密码
 立即注册
查看: 2813|回复: 7

关于计时器中出现负数的问题

[复制链接]
发表于 2022-4-21 10:45:47 | 显示全部楼层 |阅读模式

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

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

x
题目:下列程序是为了将保证listed列表里没有负数出现,但是这样是建立在lasted 比较短,6位的基础上,就有点类似没有计算器的时候拿算盘打 100000000 - 1 ,需要不断的向前借位,但是由于是十进制所以前一位-1 ,对应的负数位 + 10 得9就可以了,但是 这样的话 十位也就变成了 新的-1 个位变成了 9 ,这样不断的像前递归,只要个十百千万。。。某一位出现负数,都需要像前一位 - 1 ,这一位的数+ 10,所以基于这个我就写出来了下面这个程序。但是运行过程中,我发现需要加一个这个flag 作为停止器,否则去掉了的话,程序会进入死循环(也有可能是我对break 的理解不是很好,不知道加在哪比较合适)

问题:
1.  下列这个程序可以不可以去掉flag,用别的方法代替
2.  可以不可以用递归的思想解决
3.  这个unit列表是不是也可以省略掉 换别的更好的方法

程序
lasted = [1,0,0,0,0,-1] #年月日时分秒
unit = [12,31,60,60,60] #换算位制
flag = 1

while flag:
    for i in range(len(lasted)-1,0,-1):
        if lasted[i] < 0:
            lasted[i -1] = lasted[i -1] - 1
            lasted[i] = unit[i-1] + lasted[i]
        if i == 1:
            flag = 0

希望各位大咖能给点ideas
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-21 10:52:53 | 显示全部楼层
打扰了。。。。。 我想明白了。。。。。  我本来就是从后往前 所以就不需要while 循环了。。。  只想问下各位大神  问题 2/ 3 就行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-21 11:10:10 From FishC Mobile | 显示全部楼层
Victor0321 发表于 2022-4-21 10:52
打扰了。。。。。 我想明白了。。。。。  我本来就是从后往前 所以就不需要while 循环了。。。  只想问下各 ...

递归会导致溢出,资源耗尽。递归不能太大次数如千万次。

至于倒数,你可以试试往反方向想,从 0 开始计算,每次 +1 秒,当时间达目标时间时,暂停。这样就能避免负数了。而且也无需另外加个 unit列表,可以试试用取商和取余方法解决。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-21 12:25:16 | 显示全部楼层
傻眼貓咪 发表于 2022-4-21 11:10
递归会导致溢出,资源耗尽。递归不能太大次数如千万次。

至于倒数,你可以试试往反方向想,从 0 开始 ...

就是我想的是就是集合的后面往前面走这样是最方便的,因为就跟我们学算数一样 1000 - 1 也是从个位再去十百千, 但是如果是计算机的话有没有可能弄成从前往后循环,只要某一位出现了负数就往前借一位数,直到所有的元素都是正数,得到结果。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-21 12:54:46 From FishC Mobile | 显示全部楼层
代码供参考:
import time

class Timer:
        def __init__(self, hh, mm, ss):
                self.hour = hh
                self.minute = mm
                self.second = ss
        
        def countdown(self):
                while self.hour or self.minute or self.second:
                        print(self.hour, self.minute, self.second)
                        self.second -= 1
                        if self.second < 0:
                                self.second = 59
                                self.minute -= 1
                        if self.minute < 0:
                                self.minute = 59
                                self.hour -= 1
                        time.sleep(1)
                print(self.hour, self.minute, self.second)
                print("countdown end")

T = Timer(0, 1, 13) # 小时、分钟、秒数
T.countdown() # 开始倒数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-21 13:09:53 | 显示全部楼层

我明白了!换成那个题目的话就是while 年or月or日or时or分or秒  < 0  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-21 13:16:37 From FishC Mobile | 显示全部楼层
Victor0321 发表于 2022-4-21 13:09
我明白了!换成那个题目的话就是while 年or月or日or时or分or秒  < 0

是啊,只要确保全部不是 0,就继续循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-21 14:14:41 | 显示全部楼层
傻眼貓咪 发表于 2022-4-21 13:16
是啊,只要确保全部不是 0,就继续循环

了解了!多谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 17:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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