解题思路:借用了@小哈哈这位兄弟的题解:
题目中说“bdfij”与“bdghi”是依次的Jam数字,意思就是两个数相邻
只是bdfij < bdghi 然而我们要知道为什么 bdfij < bdghi其实只是对bdfij这个数从第五位开始递增来推的,因为第五位的j如果加1本来应该等于k的,但是k不在{b,c,d,e,f,g,h,i,j}这个范围内,所以要从第四位的 i 来看,但是如果 i 增加1就是 j 了,就等于第五位的 j 了,所以第四位也不能加1,那么我们来看第三位的 f ,因为f加一等于 g而 g在{b,c,d,e,f,g,h,i,j}这个范围内,而且它也不大于第四位的 i,所以我们在第三位做加一操作,把 f 变成 g ,然后我们再回到第四位 让 i做减一操作,因为i减一变成h,如果它又减一就会变成g,这时候它就没有比第三位大了,所以它不能减两次一,只能减一次一,从而变成 h,接下来我们再看第五位,如果j减一的话,变成i,没有比第四位小,如果再减一呢,显然等于第四位的h了,所以它也不能减两次一它只能减一次一,变成i(总结一下,就是从后往前判断,先判断最后一个数字加1超单纯拿数字举例,比如12367,然后范围是(1~7) ,加1看看满足不超过范围且比后面的数字小这个条件,7+1超过了7,不行,然后看6,6+1等于7,不小于后面这一位的7,也不行,再看3,3+1=4,满足条件,所以3变成4,也就是12467,然后确定了4,因为是求当前数字的下一个,所以要求最小(注意是递增),所以4后面的数字依次加1就行了,也就是变成12456)
注意事项:
参考代码:
s,t,w=map(int,input().split()) #确定字母的范围 le=[chr(i) for i in range(ord('a'),ord('a')+26)][s-1:t] letter=input().strip() #记录输出的次数 cnt=0 #Max存储的是最大字母的ASCII码 Max=ord(le[-1]) #如果字符串长度是w就进入while循环 while len(letter)==w: #不能超过五次输出 if cnt==5: break #如果字符串倒数第一位的值加1在范围内 if ord(letter[w-1])+1<=Max: #最后一位直接加1输出 letter=letter[:w-1]+chr(ord(letter[w-1])+1) print(letter) cnt+=1 continue #从倒数第二个开始判断 for i in range(w-2,-1,-1): #如果当前字符串对应的值+1没有超过范围(我这里的范围就是说这个字母的ASCII码值+1没有超过最大的字母的ASCII值),并且小于后面一位的值 if ord(letter[i])+1<= t+ord('a')-1 and ord(letter[i])+1<ord(letter[i+1]): #先取前i位的字母(下标为0到i-1) temp=letter[:i] #第i位直接加1 temp_i=chr(ord(letter[i])+1) #第i到第w位依次加递增(比如12367,第三位是3,上面一步temp_i则变成3+1=4,这时temp=12,后面循环temp依次变为:124,1245,12456) for j in range(w-i): temp+=chr(ord(temp_i)+j) #将temp赋值给letter letter=temp print(letter) #次数加1 cnt+=1 break else: #如果等于i=0,且没有执行前面的break,说明没有位置满足条件,也就是说没有这样的数字了 if i==0: #len(letter)=0,从而终止了while循环 letter='' break
0.0分
1 人评分
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:1045 |
校门外的树 (C语言代码)浏览:751 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)浏览:511 |
【出圈】 (C语言代码)浏览:590 |
数组输出 (C语言代码)错误???浏览:602 |
C语言程序设计教程(第三版)课后习题8.3 (C语言代码)浏览:790 |
C语言程序设计教程(第三版)课后习题8.2 (C语言代码)浏览:5275 |
WU-整除问题 (C++代码)浏览:648 |
蚂蚁感冒 (C语言代码)浏览:816 |
川哥的吩咐 (C语言代码)浏览:663 |