愚人土地议会的新集会由N名代表组成。 根据现行规定,代表们应分为不同规模的不相交群体,每天每个小组必须派一名代表参加和解委员会。 和解委员会的组成应该每天都不同。 议会只有在完成这项工作的情况下才能运作。 您将编写一个程序,确定每个组应包含多少代表,以便议会尽可能长时间地工作。
输入
输入文件包含单个整数N(5 <= N <= 1000)。
输出
将输出文件写入允许议会在最长可能时间内工作的组的大小。 这些尺寸应按升序打印在一行上,并应以空格分隔。
样例输入
7
样例输出
3 4
分析可知,要将n个人分成不同的小组s1、s2、s3......(且s1、s2、s3..不能相等,因为题目要求小组规模不同),可知要求的是最大值smax=s1*s2*s3*....。解题思路,首先可以将一个数分辨一下是奇数还是偶数,如果是奇数如11,则要将它先分解成5、6;其次分解出来的数如果大于等于5(5<2*3),则可以进行再次分解,5、6都满足要求,现在这里有个问题是先分解5,还是先分解6,如果先分解5,则可以分解为2、3,6则不能进行分解,因为6分成2、4就会重复,所以应先分解6;最后将所有分解所得最终的数放入s列表。偶数类似,代码如下:
"""n=s1+s2+s3....
smax=s1*s2*s3*...
即要找出smax来,就要找出数值不一样的s1,s2,s3....
"""
#该函数主要是用来区别输入是奇数还是偶数
#奇数执行search1,偶数执行search2
def main(n):
if n%2!=0:
search1(n)
else:
search2(n)
#如果是奇数,则分解为s1、s2
#如19,要分解为9、10
def search1(n):
s1=n//2
s2=s1+1
#分解出来的数不能和原来分解出来的数相同
if s1 not in s and s2 not in s:
# 该函数如果分解出来的数s1、s2大于等于5就还要再次分解(5<2*3)
if s1>=5 or s2>=5:
if s1>=5 and s2>=5:
#由于s2>s1,故先执行main(s2),再执行main(s1),位置不可以对换,大家可以试试对换后的结果
main(s2)
main(s1)
elif s2>=5 and s1<5:
s.append(s1)
main(s2)
elif s2<=5 and s2>5:
s.append(s2)
main(s1)
# 如果函数分解出来的数s1、s2小于5,则直接进行存储进列表
else:
s.append(s1)
s.append(s2)
#如果分解出来的数,与前面分解出来的数发生重复,则不进行分解,直接存储到列表中
else:
s.append(n)
#如果是偶数,则要进行分解为s3、s4
#如10,分解为6、4
def search2(n):
s3=n/2+1
s4=n/2-1
# 分解出来的数不能和原来分解出来的数相同
if s3 not in s and s4 not in s:
# 该函数如果分解出来的数s3、s4大于4就还要再次分解(6<2*4)
if s3>4 or s4>4:
if s3>4 and s4>4:
main(s3)
main(s4)
elif s3>4 and s4<=4:
s.append(s4)
main(s3)
elif s4>4 and s3<=4:
s.append(s3)
main(s4)
# 如果函数分解出来的数s3、s4小于等于4,则直接进行存储进列表
else:
s.append(s3)
s.append(s4)
#如果分解出来的数,与前面分解出来的数发生重复,则不进行分解,直接存储到列表中
else:
s.append(n)
if __name__ == '__main__':
#创建一个储存分解出来的列表
s=[]
#输入要是一个正整数
n=int(input())
#执行主要函数
main(n)
#观察n分解为多少个大小不同的小组,满足n=s1+s2+s3....
print(s)
smax=1
#累乘smax=s1*s2*s3*...
for a in s:
smax=smax*a
#最终结果
print(smax)
假设输入100,可得如下结果:
100
[3.0, 5.0, 4.0, 2.0, 12.0, 25.0, 49.0]
1764000.0
发现49明明还可以分23和26(不可以分成24、25),因为上述代码奇数只能分解为两个相差为1的数,偶数只能分解为两个相差为2的数,下面对其进行改进:
"""n=s1+s2+s3....
smax=s1*s2*s3*...
即要找出smax来,就要找出数值不一样的s1,s2,s3....
"""
# 该函数主要是用来区别输入是奇数还是偶数
# 奇数执行search1,偶数执行search2
def main(n):
if n%2!=0:
search1(n)
else:
search2(n)
#如果是奇数,则分解为s1、s2
#如19,要分解为9、10
def search1(n):
c1=0
for i in range(0,int(n//2-1)):
s1=n//2-i
s2=n//2+1+i
#分解出来的数不能和原来分解出来的数相同
if s1 not in s and s2 not in s:
# 该函数如果分解出来的数s1、s2大于等于5就还要再次分解(5<2*3)
if s1>=5 or s2>=5:
if s1>=5 and s2>=5:
#由于s2>s1,故先执行main(s2),再执行main(s1),位置不可以对换,大家可以试试对换后的结果
main(s2)
main(s1)
break
elif s2>=5 and s1<5:
s.append(s1)
main(s2)
break
elif s2<=5 and s2>5:
s.append(s2)
main(s1)
break
# 如果函数分解出来的数s1、s2小于5,则直接进行存储进列表
else:
s.append(s1)
s.append(s2)
break
else:
c1 = c1 + 1
#如果分解出来的数,与前面分解出来的数发生重复,则不进行分解,直接存储到列表中
if c1==n//2-1:
s.append(n)
# print('c1', c1)
#如果是偶数,则要进行分解为s3、s4
#如10,分解为6、4
def search2(n):
c2=0
for j in range(1,int(n/2-1)):
s3=n/2+j
s4=n/2-j
# 分解出来的数不能和原来分解出来的数相同
if s3 not in s and s4 not in s:
# 该函数如果分解出来的数s3、s4大于4就还要再次分解(6<2*4)
if s3>4 or s4>4:
if s3>4 and s4>4:
main(s3)
main(s4)
break
elif s3>4 and s4<=4:
s.append(s4)
main(s3)
break
elif s4>4 and s3<=4:
s.append(s3)
main(s4)
break
# 如果函数分解出来的数s3、s4小于等于4,则直接进行存储进列表
else:
s.append(s3)
s.append(s4)
break
else:
c2=c2+1
# else:
#
# break
if c2==n/2-2:
#如果分解出来的数,与前面分解出来的数发生重复,则不进行分解,直接存储到列表中
# else:
s.append(n)
if __name__ == '__main__':
#创建一个储存分解出来的列表
s=[]
#输入要是一个正整数
n=int(input())
#执行主要函数
main(n)
#观察n分解为多少个大小不同的小组,满足n=s1+s2+s3....
print(s)
smax=1
#累乘smax=s1*s2*s3*...
for a in s:
smax=smax*a
#最终结果
print(smax)
再次输入100,结果如下:
100
[3.0, 5.0, 4.0, 2.0, 12.0, 8.0, 6.0, 11.0, 15.0, 10.0, 17.0, 7.0]
13571712000.0
问题得以解决,初学者,代码囧长,多多见谅!!!