#include <stdio.h>
#include <math.h>
#define N 200
double fun_1( int );
void main( void )
{
int n;
double sum = 0.0;
for ( n = 1; n < N+1; n++ )
{
sum += ( 1-fun_1(n) )/( 1+sqrt(5) - (1-sqrt(5))*fun_1(n) )*2;
printf("前%-5d项和是%-20.15lf程序计算增量为%-20.15lf", n, sum, ( 1-fun_1(n) )/( 1+sqrt(5) - (1-sqrt(5))*fun_1(n) )*2);
printf("理论极限增量为%-20.15lf\n", ( sqrt(5) - 1 )/2);
}
}
double fun_1( int n )
{
int i;
double p = 1.0;
for ( i = 0; i < n; i++ ) p *= ( sqrt(5)-3 )/2;
return p;
}作者: 5毛党党员 时间: 2008-09-27 09:52
呵呵 这个已经从算法问题变成归纳数学公式了作者: xwolff 时间: 2008-09-27 10:01 标题: 运行示例 前30 项和是18.840600687172167 程序计算增量为0.618033988749648 理论极限增量为0.618033988749895
前31 项和是19.458634675922156 程序计算增量为0.618033988749989 理论极限增量为0.618033988749895
前32 项和是20.076668664672013 程序计算增量为0.618033988749859 理论极限增量为0.618033988749895
前33 项和是20.694702653421921 程序计算增量为0.618033988749909 理论极限增量为0.618033988749895
前34 项和是21.312736642171810 程序计算增量为0.618033988749890 理论极限增量为0.618033988749895
前35 项和是21.930770630921707 程序计算增量为0.618033988749897 理论极限增量为0.618033988749895
前36 项和是22.548804619671600 程序计算增量为0.618033988749894 理论极限增量为0.618033988749895
前37 项和是23.166838608421497 程序计算增量为0.618033988749895 理论极限增量为0.618033988749895
从运行结果可以看出,当n大于等于38时通项已等于理论极限值,因而可以大大减少计算量,提高效率。改进后代码如下:
#include <stdio.h>
#include <math.h>
#define N 20000000
double fun_1( int );
void main( void )
{
int n;
double sum = 0.0;
double t;
for ( n = 1; n < 37; n++ )
{
t = ( 1-fun_1(n) )/( 1+sqrt(5) - (1-sqrt(5))*fun_1(n) )*2;
sum += t;
}
if ( N >= 37 ) sum += (N-36)*(sqrt(5)-1)/2;
printf(" 前%-6d项和为:%-20.15lf\n", N, sum);
}
double fun_1( int n )
{
int i;
double p = 1.0;
for ( i = 0; i < n; i++ ) p *= ( sqrt(5)-3 )/2;
return p;
}