编写一个C程序,求前n项之和s值(n>=1,x!=0)s=1⼀(2*x)-2*x⼀3+3⼀(5*x)+8⼀(13*x)+……(检验参考:x6.66,n=8

2025-02-24 03:24:46
推荐回答(2个)
回答1:

#include
#include

float f( int n )
{
if ( n==1 )
return 1;
else if ( n==2 )
return 2;
else
return f(n-1)+f(n-2);
}

int main()
{
int n,i;
float s=0,x;

printf( "n==" );
scanf( "%d", &n );
printf( "x==" );
scanf( "%f", &x );

if ( n==1 )
s = f(1)/(x*f(2));
else if ( n==2 )
s = f(1)/(x*f(2))-f(2)*x/f(3);
else {
for( i=3; i<=n; i++ )
s = s + f(n)/(f(n+1)*x);
s = s + f(1)/(x*f(2))-f(2)*x/f(3);
}

printf( "s==%f", s );
return 0;
}
/*******************************************************************************************
我用Mingw编译运行通过。在n==3,x=1时与笔算结果符合。
*******************************************************************************************/

回答2:

/*

要是去除第二项-2*x/3的话规律比较明显(分子和分母系数构成斐波那契数列) 。

所以计算时去除-2*x/3,单独计算-2*x/3的结果

注意,每项都可以使用前一项作为中间值,如果每次都重新计算f(n)效率非常低。

s = -3.811311 (x=6.66,n=8)

*/

#include "stdio.h"
int main()
{

int n=8;
double x=6.66;

double s =0;

int i;
int fz=1;
int fm=2;
for( i=0; i{
s += fz/(fm*x);

fz += fm;
fm = fz + fm;
}

if(n>=2)
{
s+=-2*x/3;
}
printf("result is:%lf\n",s);
return 0;
}