题目实验题1:求1~n的连续整数和
目的:通过对比同一问题不同解法的绝对执行时间,体会不同算法的优劣。
内容:编写一个程序exp1-1.cpp,对于给定的正整数n,求1+2+…+n,采用逐个累加和n(n+1)/2(高斯法)两种解法。对于相同的n,给出这两种解法的求和结果和求解时间,并用相关数据进行测试。
代码:
#include<stdio.h>
#include<time.h>
#include<math.h>
long add1(long long n)
{
long long i,sum=0;
for(i=1;i<=n;i++)
sum+=i;
return sum;
}
void AddTime1(long long n)
{
clock_t t;
long long sum;
t=clock();
sum=add1(n);
t=clock()-t;
printf("方法1:\n");
printf("结果:%lld\n",sum);
printf("用时:%lf\n",((float)t)/CLOCKS_PER_SEC);
}
long add2(long long n)
{
return n*(n+1)/2;
}
void AddTime2(long long n)
{
clock_t t;
long long sum;
t=clock();
sum=add2(n);
t=clock()-t;
printf("方法2:\n");
printf("结果:%lld\n",sum);
printf("用时:%lf\n",((float)t)/CLOCKS_PER_SEC);
}
int main()
{
int n;
printf("n(大于1000000):");
scanf("%d",&n);
if(n<1000000)
return 0;
AddTime1(n);
AddTime2(n);
return 1;
}
结果问题:
当n为99999999(8个9),结果为正数;当n为77777777(8个7),结果为负数。按理说,从1加到n,99999999比77777777大,后者怎么会是负数呢?
如图所示: