将一个正整数N分解成几个正整数相加,可以有多种分解方法,例如7=6+1,7=5+2,7=5+1+1,…。编程求出正整数N的所有整数分解式子。
输入格式:
每个输入包含一个测试用例,即正整数N (0<N≤30)。
输出格式:
按递增顺序输出N的所有整数分解式子。递增顺序是指:对于两个分解序列N1={n1,n2,⋯}和N2={m1,m2,⋯},若存在i使得n1=m1,⋯,ni=mi,但是ni+1<mi+1,则N1序列必定在N2序列之前输出。每个式子由小到大相加,式子间用分号隔开,且每输出4个式子后换行。
题目分析:
做这道题的时候死了好多脑细胞,最后用一种“切割”的思路解决了问题。
#test7-37.py
outList = []
# in this function the parameter type is list
def cutNum(cutList):
global outList
if len(cutList) <= 1 or cutList[-1] == 1:
return
else:
last = cutList[-1]
frontPart = cutList[0:-1]
for left in range(1,last//2+1):
if left >= frontPart[-1]:
right = last - left
newList = frontPart+[left,right]
outList.append(newList)
cutNum(newList)
# in this function, N is int, nList is list
def userFormat(N,nList):
for item in nList:
itemStr = ""
for c in item:
itemStr += "+" + str(c)
nstr = str(N) + "=" + itemStr[1:]
if (nList.index(item) + 1) % 4 == 0 or nList.index(item) + 1 == len(nList):
print(nstr)
else:
print(nstr, end=";")
N = eval(input())
for i in range(1,N//2+1):
j = N - i
cutNum([i,j])
outList.append([i,j])
outList.append([N])
outList.sort()
userFormat(N,outList)