求n个连续自然数之和为一个非负整数的数组

def find_combinations(num):
    n = int(num ** 0.5)  # 这里直接开根号,缩小循环范围
    
    res = [] 
    
    # 前可以转化成中间项的倍数,所以下面for循环求得是中间项的值
    for i in range(2, n + 1):
        if num % i == 0:
            mid_01 = i  # 中间数
            mid_02 = int(num / i)  # 项数
            # 分解出来为mid_01*mid_02的形式,
            if mid_02 % 2 == 1:  # mid_02为奇数
                first_1 = (mid_01 - mid_02 // 2)
                last_1 = (mid_01 + mid_02 // 2)
                if first_1 >= 0:
                    res.append('+'.join([str(j) for j in range(first_1, last_1 + 1) if j > 0]))
            else:  # mid_02 为偶数,拆分mid_01 比如:125拆成62+63
                if mid_01 % 2 == 1:
                    t_01 = int((mid_01 - 1) / 2)
                    t_02 = int((mid_01 + 1) / 2)
                    if t_01 - mid_02 >= 0:
                        lists_01 = [str(i) for i in range(t_01 - mid_02 + 1, t_01 + 1) if i > 0]
                        lists_02 = [str(i) for i in range(t_02, t_02 + mid_02) if i > 0]
                        res.append('+'.join(lists_01 + lists_02))
            # 此处仅仅将上面的mid_01*mid_02 调换成mid_02*mid_01 中间值和项数对调
            if mid_01 % 2 == 1:
                first_2 = (mid_02 - mid_01 // 2)
                last_2 = (mid_02 + mid_01 // 2)

                if first_2 >= 0:
                    res.append('+'.join([str(j) for j in range(first_2, last_2 + 1) if j > 0]))
            else:  # mid_02 为偶数,拆分mid_01:125拆成62+63
                if mid_02 % 2 == 1:
                    t_01 = int((mid_02 - 1) / 2)
                    t_02 = int((mid_02 + 1) / 2)
                    if t_01 - mid_01 >= 0:
                        lists_01 = [str(i) for i in range(t_01 - mid_01 + 1, t_01 + 1) if i > 0]
                        lists_02 = [str(i) for i in range(t_02, t_02 + mid_01) if i > 0]
                        res.append('+'.join(lists_01 + lists_02))
    # 上面要防止第一项等于0
    # 奇数特殊解
    if num % 2 == 1:
        mid = int((num + 1) / 2)
        res.append('+'.join([str(mid - 1), str(mid)]))
    res.append(str(num))
    if res:
        return res
    else:
        return [None]

# test
print(find_combinations(63))

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值