华为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))

标签: none

添加新评论