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

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;
}

运行结果:

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


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;
}


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


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的值为何会一样呢?

你可能感兴趣的:(第1周 C语言及程序设计初步 例程-7 问题求解方法——迭代)