数列的定义如下:数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和。
输入描述:
输入数据有多组,每组占一行,由两个整数n(n<10000)和m(m<1000)组成,n和m的含义如前所述。
输出描述:
对于每组输入数据,输出该数列的和,每个测试实例占一行,要求精度保留2位小数。
示例1
输入
81 4
2 2
输出
94.73
3.41
- 首先想到直接调用C++函数求平方根,然后根据题目要求控制小数点后两位。
代码如下:
#include<iostream>
#include<cstring>
#include<cmath>
#include<math.h>
#include<iomanip>
using namespace std;
int main(){
double n,m;
while(cin>>n>>m){
double sum=0; //初始化求和
while(m!=0){ //这里我采用的while循环,使用for循环也是可以的
sum+=n; //首先加上第一项
n=sqrt(n); //直接调用求平方根的函数
m--; //根据所输入的m的值,进行循环
}
cout<<fixed<<setprecision(2)<<sum<<endl; //fixed<<setprecision(2),这里的2表示精度为小数点后两位,这个函数直接控制输出显示
}
return 0;
}
- 根据以前的学习,求平方根还可以使用二分法、牛顿迭代法等方式。所以想看看使用这类方法的程序有啥优点。
代码如下:
#include<iostream>
#include<cstring>
#include<cmath>
#include<math.h>
#include<iomanip>
using namespace std;
//采用牛顿法
double sqrt1(double x) {
if (x == 0) {
return 0;
}
double last = 0.00;
double res = 1.00;
while (res != last) {
last = res;
res = (res + x / res) / 2;
}
return res;
}
int main(){
double n,m;
while(cin>>n>>m){
double sum=0;
while(m!=0){
sum+=n;
n=sqrt1(n);
m--;
}
cout<<fixed<<setprecision(2)<<sum<<endl;
}
return 0;
}
**发现也没啥大的提升。。。贴上两个的运行结果对比:
这个是采用牛顿法的方式得到的结果**
下面这个是直接调用函数得到的结果: