您的位置:首页 > 编程语言 > C语言/C++

第1周 C语言及程序设计初步 例程-7 问题求解方法——迭代

2016-04-02 10:56 260 查看
1、问题及代码:

/*
*copyright(c)2016,时缔实验室
*All rights reserved.
*文件名称: fn.c
*作    者: 时帝
*完成日期: 2016年4月2日
*版 本 号: v1.0
*
*问题描述:求Fibonacci(斐波那契)数列前40个数;
0,1,1,2,3,5,8,13,21…(第三个数为前两个数之和)
*输入描述:不需要输入;
*程序输出:前40个数;
*/
#include <stdio.h>
int main()
{
long f1,f2,fn;
int i;
f1=f2=1;
printf("%ld\t%ld\t",f1,f2);//t,横向跳到下一制表符位置。
for(i=3; i<=40; i++)
{
fn=f1+f2;
printf("%ld\t",fn);
if(i%5==0)// 当i%5==0为真时执行下面的换行。
printf("\n");
f1=f2;//将原先后面的数赋值给另一组两个数的前一个数
f2=fn;//将前面两数之和赋值给下一组的第二个数。
}
return 0;
}


运行结果:



2、同上另解:

/*
*copyright(c)2016,时缔实验室
*All rights reserved.
*文件名称: f.c
*作    者: 时帝
*完成日期: 2016年4月2日
*版 本 号: v1.0
*
*问题描述:求Fibonacci(斐波那契)数列前40个数;
0,1,1,2,3,5,8,13,21…(第三个数为前两个数之和)
*输入描述:不需要输入;
*程序输出:前40个数;
*/
#include <stdio.h>
int main()
{
long f1,f2;//到后面数会很大需用long;
int i;
f1=f2=1;
for(i=1; i<=20; i++)//i=1定义初始值,1<=20,为何结果也是有40代
{
printf("%ld\t%ld\t",f1,f2);
if(i%2==0)
printf("\n");
f1=f1+f2;//左f1代表第3个数,是第1、2数之和
f2=f1+f2;//左f2代表第4个数,是第2、3数之和
}
return 0;
}




3、求级数公式(精确到小数点后5位)

/*
*copyright(c)2016,时缔实验室
*All rights reserved.
*文件名称: sum.c
*作    者: 时帝
*完成日期: 2016年4月2日
*版 本 号: v1.0
*
*问题描述:求级数公式(精确到小数点后5位);
*输入描述:输入一个值;
*程序输出:输出结果;
*/
#include <stdio.h>
#include <math.h>
int main()
{
double x, sum=1, term=1;
int i=1;//一定要赋初值
scanf("%lf", &x);
while(fabs(term)>=1e-5)//fabs()函数表示,求浮点数绝对值的函数。
{
term=term*(-1)*x/((2*i));
sum=sum+term;
i++;
}
printf("输出sum的结果是%f\n", sum);
return 0;
}


4、另一个正解:

/*
*copyright(c)2016,时缔实验室
*All rights reserved.
*文件名称: sum.c
*作    者: 时帝
*完成日期: 2016年4月2日
*版 本 号: v1.0
*
*问题描述:求级数公式(精确到小数点后5位);
0,1,1,2,3,5,8,13,21…(第三个数为前两个数之和)
*输入描述:输入一个数;
*程序输出:输出结果;
*/
#include <stdio.h>
int main()
{
double x, sum=1, term=1;
int i=1;//一定要赋初值
scanf("%lf", &x);
while(fabs(term)>=1e-5)//为何同样调用了该函数,却可以不用<math.h>头文件?没有调用怎么判断?
{
sum=sum+term;
term=term*(-1)*x/((2*i));
i++;
}
printf("%f\n", sum);
return 0;
}


知识总结:

熟悉一个新的函数fabs();

学习心得:

对级数的概念不太清楚,需要多了解学习这方面的知识。

求级数公式的另一个正解里,为何不需要调用<math.h>,while()里不是有用fabs()函数吗,不调用如何判断真假呢。

还有,sum=sum+term;

term=term*(-1)*x*x/((2*i)*(2*i-1)); //即,相当于是前面的两个语句对调,这样sum的值为何会一样呢?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: