蓝桥杯 入门训练 BEGIN-2 序列求和
题干要求:
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
求1+2+3+…+n的值。
输入格式
输入包括一个整数n。
输出格式
输出一行,包括一个整数,表示1+2+3+…+n的值。
样例输入
4
样例输出
10
样例输入
100
样例输出
5050
数据规模与约定
1 <= n <= 1,000,000,000。
说明:请注意这里的数据规模。
本题直接的想法是直接使用一个循环来累加,然而,当数据规模很大时,这种“暴力”的方法往往会导致超时。此时你需要想想其他方法。你可以试一试,如果使用1000000000作为你的程序的输入,你的程序是不是能在规定的上面规定的时限内运行出来。
本题另一个要值得注意的地方是答案的大小不在你的语言默认的整型(int)范围内,如果使用整型来保存结果,会导致结果错误。
如果你使用C++或C语言而且准备使用printf输出结果,则你的格式字符串应该写成%I64d以输出long long类型的整数。
解析:
本题难度看上去并不高,但是正入题干中提到的,有两个需要注意的点
1、n值很大时,用循环累加会超时
2、n值很大时,累加和会超过整型变量的范围
因此不能用循环累加的方法求解本题:
n = int(input())
result = 0
for i in range(1,n+1):
result += i
print(result)
样例中有一个输入100,输出5050,做题时,这个样例让我回想起上小学数学时的一个小故事,关于数学家高斯小时候上课求解1 - 100之和的故事。
故事中的小高斯并没有像其他同学一样一个一个数字依次相加(循环累加),而是将1和100相加,2和99相加,以此类推,1 - 100中共有50个这样的两两相加组合(101),所以答案是 50 X 101 = 5050
通过这个想法推广,可以得到解这类题的关键——等差数列求和公式
sum = (s1 + sn) * n / 2
解这类耗时的循环计算题时,可以考虑是否能通过规律或公式一步到位。
代码
# 获取n值,转化为整型方便计算
n = int(input())
# 通过等差数列求和公式一步求和
result = (1 + n) * n // 2
# 打印计算结果
print(result)
这里需要注意的是,公式中 “除以2” 这一步,在代码中要使用 // 运算符,不能使用 / 运算符。
两者的区别:
1、// 是除法取整,计算结果只包含整数部分的商,不含小数点
2、/ 是真正的除法,计算结果是包含小数点的完整商,即使被除数与除数间可以整除,也会留下小数点。
如果使用 / 运算符,带有小数点的打印结果是会被判为解答错误的。