问题描述
求1+2+3+…+n的值。
输入格式
输入包括一个整数n。
输出格式
输出一行,包括一个整数,表示1+2+3+…+n的值。
样例输入
4
样例输出
10
样例输入
100000
样例输出
5000050000
初始代码
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
int sum = 0;
int i=1;
for (i = 1;i <= n; i++)
{
sum = sum + i;
}
printf("%d\n", sum);
return 0;
}
在蓝桥杯系统中的测试结果
输入测试数据
输入测试数据100000输出的结果却是错误的,所以这个程序并不是完全正确的。原因是发生了溢出。
有正确的测试点,也有错误的测试点。我查看了错误的测试点,发现是数据溢出了。我意识到int数据类型的范围是不够的。int类型的数值范围是32/64位系统中都是32位,范围为-2147483648至+2147483647,无符号情况下表示为0~4294967295
因为发生溢出于是我开始思考转变求和的数据类型,将数据类型的范围扩大,并且正确的输出。
于是将int类型的sum换成了long long sum,此时注意输出格式也要转换一下。long long sum的输出格式是printf("%I64d\n", sum)。
于是修改后的程序如下。
修改后的程序
#include<stdio.h>
int main()
{
long long n;
scanf("%I64d", &n);
long long sum = 0;
sum=(n*(n+1))/2;
printf("%I64d\n", sum);
return 0;
}
运行结果
测试结果
此时的测试结果是完全正确。这就告诉了我,在测试较少和较小数据时不要妄下定论认为程序是正确的,在测试多组数据之后,并且考虑到可能会溢出的结果之后,确定程序在任何条件下运算出来的都是正确的之后再下定论程序是正确的。