连续正整数的和

【问题描述】

对于一个正整数x(3≤x≤1000),寻找一种方案,将x分解成连续正整数的和。即
x=x1+x2+…+xn
其中x1、x2、…、xn是自小至大的连续正整数,且n>1。
比如,对于输入的数字10,可以分解成"10=1+2+3+4"。
如果存在多于一种的可行方案,则选取等式右边项的个数最多的那一种。比如,9可以分解为"9=2+3+4",也可以分解为"9=4+5"。但是前一种分解成3个数的和,后一种分解成2个数的和,所以前一种是有效解。
【输入文件】

输入文件为当前目录下的scpi.in,该文件只含有一个正整数x。
【输出文件】

输出文件为当前目录下的scpi.out。

如果x可以分解为连续正整数的和,则按如下格式输出一行等式:
x=x1+x2+…+xn
如果无法分解,则打印"x:NOANSWER"。
【样例输入1】

38
【样例输出1】

38=8+9+10+11
【样例输入2】

256
【样例输出2】

256:NOANSWER
【样例说明】样例1说明38可以分解为连续正整数8,9,10,11的和,而256则不能分解为连续正整数的和

def output(m, n):
    g.write(str(x))
    g.write('=')
    for i in range(m, n + 1):
        g.write(str(i))
        if i < n:  # 判断是否输入 +
            g.write('+')


f = open('scpi.in')  # 打开文件
x = int(f.readline())  # 读取文件第一行
flag = 0  # 表及存在不存在
g = open('scpi.out', 'a')  # 打开文件
g.seek(0)  # 定位位置
g.truncate()  # 从定位开始清空
list_i = []
list_j = []
for i in range(x):
    sm = 0  # 和
    for j in range(i, x):
        sm += j  # 求和
        if sm == x:
            flag = 1
            list_i.append(i)
            list_j.append(j)
            break  # 退出循环
if flag == 0:  # 不存在时
    g.write(str(x))
    g.write(':NOANSWER')
else:
    list_result = []  # 最大值
    for i in range(len(list_i)):  # 求差值储存在新列表中
        list_result.append(list_j[i] - list_i[i])
    t = max(list_result)  # 求差值最大值
    for i in range(len(list_i)):  # 获取最大值所在位置
        if t == list_result[i]:
            output(list_i[i], list_j[i])  # 调用函数写入文件
f.close()
g.close()
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值