jam的计数法

因为刚开始不太会写,参考了这篇博客,然后转成python

https://blog.csdn.net/u014788620/article/details/84590303

题目:

Jam是个喜欢标新立异的科学怪人。他不使用阿拉伯数字计数,而是使用小 写英文字母计数,他觉得这样做,会使世界更加丰富多彩。在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文字母按原先的顺序,排在前 面的字母小于排在它后面的字母。我们把这样的“数字”称为Jam数字。在Jam数字中,每个字母互不相同,而且从左到右是严格递增的。每次,Jam还指定 使用字母的范围,例如,从2到10,表示只能使用{b,c,d,e,f,g,h,i,j}这些字母。如果再规定位数为5,那么,紧接在Jam数字 “bdfij”之后的数字应该是“bdghi”。(如果我们用U、V依次表示Jam数字“bdfij”与“bdghi”,则U〈V,且不存在Jam数字 P,使U〈P〈V)。你的任务是:对于从文件读入的一个Jam数字,按顺序输出紧接在后面的5个Jam数字,如果后面没有那么多Jam数字,那么有几个就 输出几个。

input
2 10 5
bdfij

output

bdghi
bdghj
bdgij
bdhij
befgh

 

解释一下啥意思,刚开始我居然没看懂题目。。。。

其实就是jam给一些连续的字母,然后再给一个起始“数”,拿这些字母来组成一系列的严格递增的“数”

例如:

输入 2,10,5

这里的2和10对应着26个字母,所以就是b和j,b到j之间有c、d、e、f、g、h、i

然后从这9个字母中取5个字母组成“数”

比如,bdfij

然后他后面紧跟着的是bdghi,为啥是这个呢,

先看一下另一组:

bdghj bdgij

其实是从最后一位,也就是个位,开始比较,上面两个,个位都是j,而且都是最大的一个字母了,所以后一个比前一个大只能十位比前一个大,h<i,所以变为i

所以在编程时从最后一位开始看,如果最后一位最大,则往前面开始找。

注意的是,某一位确定之后,后面的应比其大(递增状态)

步骤:

判断末尾位是否最大

如果不是,就直接加一

如果是,则看倒数第二位是否是最大(注意这里的最大,是倒数第二位的最大,倒数第二位的最大,比倒数第一位的最大少一,也就是说,如果最后一位是j,则倒数第二位的最大应该是i)

         如果倒数第二位不是最大,就加一,同时,倒数第一位的值应比倒数第二位大一

        如果是最大,则继续向前看【可以看到,如果某一位是最大的时候,就一直向前找,这里就开始了递归】

 


s = 2
t = 10
w = 5


def Jams_count(num,index,heigh,flag,count):

    if count == 5 or index==-1:
        exit(0) #注意这里是exit,而不是return,用return的话是返回上一个调用它的函数

    k=ord(num[index])-97  #这里是计算当前位置的字母对应的索引
    if k<heigh-1:         #比较是否是当前位置的最大
        num[index]=chr(ord(num[index])+1)   #如果不是最大,则就可以直接加一
        if flag:           #判断是否需要对后一位进行改变
            while index<w-1:  #如果需要改变,则后面每一位,都比前一位大一
                index+=1
                num[index]=chr(ord(num[index-1])+1)
            print(num)     #完成更改后打印jam数
            count+=1       #这里是因为题目要求打印5个,在这里记录一下个数
            Jams_count(num,w-1,t,False,count)  #然后继续从最末端开始看
        print(num)        #如果不需要更改,则直接改变末尾位之后就打印出来
        count+=1          #计数加一
        Jams_count(num,index,heigh,False,count)   #然后再继续从当前位开始看
    else:
        Jams_count(num,index-1,heigh-1,True,count) #如果当前位是当前位可取的最大值,则往前看




if __name__=='__main__':
    # s=int(input())
    # t=int(input())
    # w=int(input())
    # num=[]
    # for i in range(w):
    #     num.append(input())
    # s=2
    # t=10
    # w=5
    num='bdfij'
    num=list(num)
    count=0
    index=w-1

    Jams_count(num,index,t,False,count)



 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值