要求:
http://codeup.cn/problem.php?cid=100000588&pid=10
说明:
特别把这一题拿出来,这一题用递归很容易实现,but,第一次写的这个代码,没有用一个中间变量,导致超时了。。
这是超时的代码:
#include
#include
double F(int a,int b,double x){
if(b == 0){
x = (double)a;
}
else{
b = b - 1;
x = F(a,b,x)*2/3 + a/(3*F(a,b,x)*F(a,b,x));
}
return x;
}
int main(){
int a,n;
while(scanf("%d %d",&a,&n) != EOF){
double t = 0;
printf("%.6f\n",F(a,n,t));
}
return 0;
}
这是修改后的代码:
#include
#include
double a,x;
double F(double a,int b,double x){
if(b == 0){
x = a;
}
else{
double temp = F(a,b-1,x);//这种效率明显比写多个 F(a,b-1,x)效率要高!!!
x = temp*(2.0/3.0) + a/(3*temp*temp);
}
return x;
}
int main(){
int n;
while(scanf("%lf %d",&a,&n) != EOF){
printf("%.6f\n",F(a,n,x));
}
return 0;
}
水题,但还是记录下,这种递归似乎找到点门路了。。这一题要求前后两次绝对值之差<0.00001,而不是明确告诉你迭代多少次,所以b先不设上限,当符合条件时break即可
问题 1021: [编程入门]迭代法求平方根
https://www.dotcpp.com/oj/problem1021.html
代码:
#include
#include
#include
using namespace std;
double F(int a,int b,double x){
if(b == 0){
x = (double)a;
}
else{
b = b - 1;
x = (F(a,b,x)+ a/F(a,b,x))/2;
}
return x;
}
int main(){
int a;
scanf("%d",&a);
double x = 0;
for(int b = 1;;b++){
if(F(a,b,x)-F(a,b-1,x) <0.00001 && F(a,b,x)-F(a,b-1,x) > -0.00001){
printf("%.3f\n",F(a,b,x));
break;
}
}
}