【问题描述】
对于一个正整数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()