编写一个程序exp1-1.cpp,对于给定的正整数n,求1+2+…十n,采用逐个累加与n(n+1)/2(高斯法)两种解法。对于相同的n,给出这两种解法的求和结果和求解时间,并用相关数据进行测试。
时间: 2023-09-23 13:05:48 浏览: 312
n进制加法.cpp
### 回答1:
我可以给你一个参考的程序:#include<iostream>
using namespace std;
// 逐个累加法
int add(int n)
{
int sum = 0;
for(int i=1; i<=n; i++)
{
sum += i;
}
return sum;
}// 高斯法
int gauss(int n)
{
return n*(n+1)/2;
}int main()
{
int n;
cout<<"请输入正整数n:";
cin>>n;
cout<<"逐个累加法求和结果:"<<add(n)<<endl;
cout<<"高斯法求和结果:"<<gauss(n)<<endl;
return 0;
}
### 回答2:
编写程序exp1-1.cpp实现对于给定的正整数n,求1到n的和。
首先,我们可以采用逐个累加的解法:
```cpp
#include <iostream>
#include <chrono>
using namespace std;
using namespace std::chrono;
int sumByAccumulation(int n) {
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += i;
}
return sum;
}
int main() {
int n;
cout << "请输入一个正整数n:";
cin >> n;
auto start = high_resolution_clock::now();
int sum1 = sumByAccumulation(n);
auto stop = high_resolution_clock::now();
auto duration = duration_cast<microseconds>(stop - start);
cout << "累加法结果:" << sum1 << endl;
cout << "求解时间:" << duration.count() << " microseconds" << endl;
return 0;
}
```
然后,我们可以采用高斯法的解法:
```cpp
#include <iostream>
#include <chrono>
using namespace std;
using namespace std::chrono;
int sumByGauss(int n) {
return n * (n + 1) / 2;
}
int main() {
int n;
cout << "请输入一个正整数n:";
cin >> n;
auto start = high_resolution_clock::now();
int sum2 = sumByGauss(n);
auto stop = high_resolution_clock::now();
auto duration = duration_cast<microseconds>(stop - start);
cout << "高斯法结果:" << sum2 << endl;
cout << "求解时间:" << duration.count() << " microseconds" << endl;
return 0;
}
```
最后,我们进行测试:
输入数据n=10,得到的结果如下:
```
请输入一个正整数n:10
累加法结果:55
求解时间:4 microseconds
高斯法结果:55
求解时间:0 microseconds
```
可以看到,两种解法的结果都是55,但高斯法的求解时间更小。这是因为高斯法只需要进行一次乘法和一次除法操作,而累加法需要进行n次加法操作。对于较大的n,高斯法相对于累加法有更好的性能。
### 回答3:
首先我们需要理解题目的要求,即编写一个程序exp1-1.cpp,对于给定的正整数n,求1到n的和。要求采用逐个累加的方式和高斯法两种解法,并比较它们的结果和求解时间。
逐个累加的方法即将从1到n的每个数依次相加得到总和。高斯法是根据高斯求和公式,直接计算1到n的和,公式为n*(n+1)/2。
接下来我们可以编写程序exp1-1.cpp来实现这两种方法的求和。
```cpp
#include <iostream>
#include <chrono> // 用于计时
using namespace std;
// 逐个累加的解法
int sumByIteration(int n) {
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += i;
}
return sum;
}
// 高斯法的解法
int sumByGauss(int n) {
return n * (n + 1) / 2;
}
int main() {
int n;
cout << "请输入一个正整数n:";
cin >> n;
// 逐个累加的解法
auto start1 = chrono::steady_clock::now(); // 开始计时
int sum1 = sumByIteration(n);
auto end1 = chrono::steady_clock::now(); // 结束计时
chrono::duration<double> diff1 = end1 - start1; // 计算时间差
// 高斯法的解法
auto start2 = chrono::steady_clock::now(); // 开始计时
int sum2 = sumByGauss(n);
auto end2 = chrono::steady_clock::now(); // 结束计时
chrono::duration<double> diff2 = end2 - start2; // 计算时间差
// 输出结果
cout << "逐个累加的解法,求和结果为:" << sum1 << ",求解时间为:" << diff1.count() << "秒" << endl;
cout << "高斯法的解法,求和结果为:" << sum2 << ",求解时间为:" << diff2.count() << "秒" << endl;
return 0;
}
```
在程序中,我们使用chrono库来计时。首先用户输入一个正整数n,然后分别调用逐个累加的解法和高斯法的解法来计算1到n的和。程序会自动计时并输出两种方法的结果和运行时间。
通过测试相同的n,可以比较两种解法的求和结果和求解时间。其中高斯法的解法效率更高,时间复杂度为O(1),而逐个累加的解法时间复杂度为O(n)。因此,当n较大时,高斯法的解法更快速。
综上,以上程序实现了题目要求的功能,可以通过相关数据进行测试。
阅读全文