华为OD机试第二题
题目描述:
将一个数展开为连续的自然数之和。
解答:
一开始还没平静下来,然后后面很快就想起了1+...+100这个事情了,然后弄个公式反推即可(等差数列)。
多个连续自然数相加=(首项+末项)×项数÷2
项数k从1开始,所以下面有个减一
N = min + (min+1) + ... + (min+k-1) = (min + (min+k-1))*k/2
然后得到第一个数
min = (N / k * 2 + 1 - k) / 2
最后判断min是不是一个整数即可
import sys
for line in sys.stdin:
num = int(line.strip())
c = 0
k = 1
while True:
_min = (num / k * 2 + 1 - k) / 2
if _min <= 0: break
if (_min % 1 > 0) is False:
c += 1
text = str(num) + "=" + "+".join([str(int(_min)+_*1) for _ in range(k)])
print(text)
k += 1
print("Result:" + str(c))