while True: try: inputs = list(map(str, input().split())) s1 = inputs[0] s2 = inputs[1] len1 = int(inputs[2]) len2 = int(inputs[3]) #确定字母对应的范围 a = ord("a") z = ord("z") letter_set = {} for i in range(26): letter_set[chr(ord("a")+i)] = i #在len1和len2之间考察 num = 0 for i in range(len1, len2+1): #每一个长度i里只考虑s1,s2中的前i项,不足的就补一个0在后面,但是要求考察的这个数在这个长度下每一位都是满的 #s1,s2看作i位的26进制数字,不够的看为0,把它们转化为10进制数字n1,n2 n1 = 0 n2 = 0 for j in range(i): if j <= len(s1): n_tmp = ord(s1[j]) - a n1 += n_tmp*26**(i - j - 1) if j <= len(s2): n_tmp = ord(s2[j]) - a n2 += n_tmp*26**(i - j - 1) num += n2 - n1 if i == len(s2): num -= 1 print(num) except: break
就是把字母看成26进制的数字串,len1到len2为取头多少位构建一个26进制的数字,比如s1= ab, s2 = ce,遍历到长度为i = 1时候(i~[len1, len2]),当前步里只考察前1项,即a和c,由于是26进制,所以a=0,b=1...z=25,就想象数字0123456789本质也都是字母,0是当中在每一位中能出现的最小的数字,所以a=0;如果s1,s2没有i这么长,构建i位26进制数时就给后面都补上a,相当于补0。每一个i长度下,构建出s1,s2对应的26进制数后转换位10进制数n1,n2,那么在i长度下符合要求的组合数就是n2 - n1个。求出所有长度i下的组合数的和(当len1到len2中有一个长度等于s2的长度时是会包括一个跟s2的值一样的数,所以应该在该长度下减去1)。