编写一个程序exp1-1.cpp,对于给定的正整数n,求1+2+·+n,采用逐个累加与n(n+1)/2(高斯法)两种解法。对于相同的n,给出这两种解法的求和结果和求解时间,并用相关数据进行测试。
时间: 2024-09-24 18:26:27 浏览: 52
为了编写的程序 `exp1-1.cpp`,我们需要分别实现两种方法:逐个累加和使用高斯公式。首先,让我们实现这两个算法:
```cpp
#include <iostream>
#include <chrono> // 用于测量时间
// 逐个累加求和
int sumSequential(int n) {
int result = 0;
for (int i = 1; i <= n; ++i) {
result += i;
}
return result;
}
// 高斯公式求和
int sumGauss(int n) {
return (n * (n + 1)) / 2;
}
int main() {
int n;
std::cout << "请输入一个正整数 n: ";
std::cin >> n;
// 记录开始时间
auto startSequential = std::chrono::high_resolution_clock::now();
// 逐个累加求和并输出结果
int sequentialSum = sumSequential(n);
std::cout << "逐个累加的结果: " << sequentialSum << std::endl;
// 记录结束时间及耗时(单位:毫秒)
auto endSequential = std::chrono::high_resolution_clock::now();
double timeSequential = std::chrono::duration_cast<std::chrono::milliseconds>(endSequential - startSequential).count();
std::cout << "逐个累加耗时: " << timeSequential << "ms" << std::endl;
// 使用高斯公式求和并输出结果
int gaussSum = sumGauss(n);
std::cout << "高斯公式的结果: " << gaussSum << std::endl;
// 记录结束时间及耗时(单位:毫秒)
auto startGauss = std::chrono::high_resolution_clock::now();
gaussSum = sumGauss(n); // 高斯公式计算通常更快,无需再次计算
auto endGauss = std::chrono::high_resolution_clock::now();
double timeGauss = std::chrono::duration_cast<std::chrono::milliseconds>(endGauss - startGauss).count();
std::cout << "高斯公式耗时: " << timeGauss << "ms" << std::endl;
return 0;
}
```
在这个程序中,我们首先获取用户的输入 `n`,然后计算两种方法的和。接着,我们使用 `std::chrono::high_resolution_clock` 来测量每个方法的时间消耗。
运行这个程序后,你可以观察到不同大小的 `n` 对两种方法性能的影响,以及它们之间的差异。例如,随着 `n` 的增大,高斯公式的优势通常会更加明显,因为它避免了重复累加的过程。
阅读全文