编程,编写函数f(x),用迭代法求x=a的三次方根

#include "stdafx.h"#include <stdio.h>#include <math.h>
double f(int i ,double b){ double a[1000]; a[0]=1; a[i+1]=2/3*a[i]+b/(3*a[i]*a[i]); return a[i+1];
}
int main(int argc, char* argv[]){ int i; double b; scanf("%lf",&b); for(i=0;i<10000;i++) { if (fabs(f(i+1,b)-f(i,b))<1e-4) break; } printf("%lf\n", pow(b,1.0/3)); printf("%lf",f(i,b));
return 0;}哪里错了呢,结果显示是0

主要问题是原程序的 f 函数错了。double a[1000];的作用域是在f函数内,当函数返回时即释放,并不能像你想象的那个在下次调用时依然存在。

再者,

for(i=0;i<10000;i++)
 {
  if (fabs(f(i+1,b)-f(i,b))<1e-4)
   break;
 }
怎么能保证这10000次就一定能得到解呢?结束的条件是差<1e-4,直接做循环条件就可以了。

参考程序如下:

#include <stdio.h>
#include <math.h>
double f(double a,double x)  //x为上一个近似解
{
 x=2.0/3*x+a/(3*x*x);  //不能直接写2/3
 return x;
}
main()
{
 double a,x1,x0;
 scanf("%lf",&a);
 x1=a/3;    //假设初始值
 do
  { x0=x1;
    x1= f(a,x0);
    } while(fabs(x1-x0)>1e-4) ;
 printf("%lf\n", pow(a,1.0/3));
 printf("%lf",x0);
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-11-16