一题多解求1+(1+2)+(1+2+3)+......+(1+2+3+4+5+......+n)

【问题描述】

1. 累计相加,形如:

1+(1+2)+(1+2+3)+(1+2+3+4)+......+(1+2+3+4+5+......+n)

2. 利用 input()语句输入一个大于 1 的正整数;

3. 观察后一项与前一项的关系。

【输入/输出描述】

1. 输入一个大于 1 的正整数,假设输入合规,不考虑不合规情景,如带小数点的数,
负数等;
2. 输出累计相加的结果。

方法一

先求1+2+…+i,然后求各项之和。这是一种常规求法。代码如下:

n = int(input())
s = 0
for i in range(1, n+1):
    ss = 0
    for j in range(1, i+1):  # 求 1+2+3+…+i
        ss += j
    s += ss
print(s)

此方法的缺点是每次都要从1开始加,相对比较费时。

方法二

从计算式可知,如第一项为1的话,第i项为(i-1)+i。这样每一项只需在上一项的基础上再加i,代码如下:

n = int(input())
s = ss = 0
for i in range(1, n+1):
    ss += i      # (1+2+3+…+(i-1))+i
    s += ss
print(s)

此方法相对比较简洁,每项不需要从1开始累加,运行速度也会比较快些。

方法三

用等差数列求和公式求(1+2+3+…+i),(1+2+3+…+i)=(1+i)*i/2,有除法结果为浮点数,需转为整数。代码如下:

n = int(input())
s = 0
for i in range(1, n+1):
    s += (1 + i) * i / 2    # (1+2+3+…+i)=(1+i)*i/2
print(int(s))

此方法也相对比较简洁,直接用等差数列求和公式求(1+2+3+…+i),运行效率也比较高。

方法四

找规律,从计算式可知:n个1,n-1个2,...,1个n。

1+(1+2)+(1+2+3)+…+(1+2+3+…+n) =1*n+2*(n-1)+3*(n-2)+…+(n-1)*2+n*1,且两边对称。代码如下:

n = int(input())
s = 0  
for i in range(1, n+1):
    s += i * (n - i + 1)
print(s)

此方法也相对比较简洁,直接根据规律求和,运行效率也比较高。

方法五

由于1+(1+2)+(1+2+3)+…+(1+2+3+…+n)=1*n+2*(n-1)+3*(n-2)+…+(n-1)*2 +n*1=2*(1*n+2*(n-1)+...+(n/2)*(n/2+1))+奇数中间项,是方法四的简化。代码如下:

n = int(input())
s = 0
for i in range(1, int(n/2)+1):
    s += 2 * i * (n - i + 1)
s += (n % 2)*int(n/2+1) * int(n/2+1)  # 奇数+中间项
print(s)

你可能感兴趣的:(算法,经验分享,python,算法优化)