代码:
·
·
N = int(input())print("*"*N)
解说:Python字符串是序列,可以使用乘号(*)进行复制。
代码:
·
·
c = input()print(chr(ord(c)+ord('A')-ord('a')))
解说:ord转ASCII编码,加'A'和'a'的差,边长大写字母的ASCII编码,然后用chr转回字母。
代码:
·
·
·
·
·
·
·
·
·
N = int(input())lst = list(map(int, input().split(',')))M = len(lst)count = 0for i in range(M-1): for j in range(i+1,M): if lst[i] + lst[j] == N: count += 1print(count)
解说:map是转换序列全部元素的映射机制,上面程序中把输入字符串分割成序列后,使用这种机制映射每个元素到int函数转换;上面的双循环是标准的列表2元素组合——第一个range的参数是M-1,第二个range的参数是i+1和M。
分析:首先可以算出最后每个人的糖果数,然后考虑第一个人,有三种情况:多、等、少,多分给下一个,等直接跳到下一个(这一个也变成了下一轮的第一个),最后要解决的是少的问题。要从下一个拿,如果下一个的数量够补(可以为0),可以结束这一轮,进入下一轮,如果不够,就要递归直到够为止,然后进入下一轮(这个递归过程与允许数量为负数,结果是一样的)。代码:
·
·
·
·
·
·
·
·
·
lst = list(map(int, input().split(',')))N = len(lst)M = sum(lst)//Ncount=0for idx in range(N-1): if lst[idx] != M: lst[idx+1] += lst[idx] - M count += 1print(count)
输入样例:2,4,5,1,3
输出样例:2
经手工计算验证正确。
分析:这个问题实际是把字符串切为M+1段,每段转为数字后相乘,输入积的最大值。要解决的问题是M+1个非0有序整数,它们的和是字符串的长度。如果M是一个确定的数,那么可以用M重循环获得这些值,但M不是,只能用递归生成它们。
代码:
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
M = int(input())S = input()maxsum = 0 #最大值def camax(nums): #计算一组的值 global maxsum preIndex=0 ms = 1 for idx in nums: ms *= int(S[preIndex:preIndex+idx]) #前下标加数量截止下标 preIndex += idx ms *= int(S[preIndex]) #剩下的部分 if ms > maxsum: maxsum=msdef create(nums,n): #产生M个位置的递归函数 if len(nums) == M: #第M个数不需要(0开始) camax(nums) return for i in range(1,n): ns = nums.copy() #浅拷贝 ns.append(i) create(ns,n-i) #i最大是n-1create([],len(S)) #调用递归函数生成结果print(maxsum)