对于给定的正整数n,求1+2+... +n,采用逐个累加与n(n+1)/2(高斯法)两种解法。对于相同的n,给出这两种解法的求和结果和求解时间,并用相关数据进行测试。用c语言
时间: 2024-12-23 17:27:20 浏览: 0
求解不等式C语言小程序代码.txt
在C语言中,我们可以分别编写两个函数来实现这两个方法:
1. **逐个累加** (Sequential Addition) 的解法:
```c
#include <stdio.h>
long long sum_by_addition(int n) {
long long result = 0;
for (int i = 1; i <= n; ++i) {
result += i;
}
return result;
}
```
这种方法的时间复杂度是O(n),因为我们需要对n个数字进行一次加法操作。
2. **高斯法** (Gauss's Formula) 的解法:
```c
#include <stdio.h>
#include <math.h> // 需要math.h库来用到sqrt函数
long long sum_by_gauss(int n) {
return (n * (n + 1)) / 2;
}
```
高斯法的时间复杂度是O(1),因为我们直接计算了公式的结果,而不需要遍历所有数字。
为了测试这两种方法,你可以创建一个循环,比如从1到某个大的数值,例如10000,然后比较它们的结果以及运行时间。
```c
#include <time.h>
void test_sums() {
int n = 10000;
clock_t start_add, end_add;
clock_t start_gauss, end_gauss;
start_add = clock();
printf("Sum by addition: %lld\n", sum_by_addition(n));
end_add = clock();
start_gauss = clock();
printf("Sum by Gauss's formula: %lld\n", sum_by_gauss(n));
end_gauss = clock();
double add_time = ((double)(end_add - start_add)) / CLOCKS_PER_SEC;
double gauss_time = ((double)(end_gauss - start_gauss)) / CLOCKS_PER_SEC;
printf("Time taken for addition: %.6f seconds\n", add_time);
printf("Time taken for Gauss's formula: %.6f seconds\n", gauss_time);
}
int main() {
test_sums();
return 0;
}
```
运行这个程序,你会看到高斯法通常会比逐个累加快得多,尤其是在处理大数值时,差距会更明显。这是因为高斯法避免了线性的计算过程。
阅读全文