算法笔记——将一个数展开为连续自然数之和

470天前 · 分享 · 128次阅读

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

none

最后修改于470天前

评论

贴吧 狗头 原神 小黄脸
收起

贴吧

狗头

原神

小黄脸

目录

avatar

未末

迷失

119

文章数

272

评论数

7

分类