愚人土地议会的新集会由N名代表组成,输入文件包含单个整数N(5 <= N <= 1000)。

  愚人土地议会的新集会由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

        问题得以解决,初学者,代码囧长,多多见谅!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值