C语言第十二篇:迭代

来源:互联网 发布:刀路仿真软件 编辑:程序博客网 时间:2024/04/29 06:50


一、求菲波那切数列的前40个数


代码


/**Copyright (c)2016,刘兵马俑*All rights reserved.*文件名称:main.c*作    者:刘兵马俑*完成日期:2016/04/05*版 本 号:v1.0*问题描述:使用迭代法求斐波那契数列的前四十个数*程序输出:*/#include <stdio.h>#include <stdlib.h>int main(){    int f1,f2,fn;    int i;    f1=f2=1;    fn=0;    printf("斐波那契数列的初值为:");    printf("f1=%d\tf2=%d\t\n",f1,f2);    //求斐波那契数列f3-f40的值    for(i=3;i<=40;++i)    {        fn=f1+f2;        printf("f%d=%d\t",i,fn);        if(i%5==0)            printf("\n");        f1=f2;        f2=fn;    }    return 0;}


运行结果





二、求1!+2!+3!+...+20!


代码


/**Copyright (c)2016,刘兵马俑*All rights reserved.*文件名称:main.c*作    者:刘兵马俑*完成日期:2016/04/05*版 本 号:v1.0*问题描述:求1!+2!+3!+...+20!*程序输出:*/#include <stdio.h>#include <stdlib.h>int main(){    int i=1,sum=0,f=1;    while(i<=20)    {        f=f*i;        sum=sum+f;        ++i;    }    printf("1!+2!+3!+...+20!=%d\n",sum);    return 0;}


运行结果





三、求级数公式(精确到小数点后五位)




代码


/**Copyright (c)2016,刘兵马俑*All rights reserved.*文件名称:main.c*作    者:刘兵马俑*完成日期:2016/04/05*版 本 号:v1.0*问题描述:求级数公式(精确到小数点后五位)*程序输出:*/#include <stdio.h>#include <stdlib.h>#include <math.h>int main(){    double x,sum=1,term=1;    int i=1;    printf("请输入x:");    scanf("%lf",&x);    while(fabs(term)>=1e-5)    {        term=term*(-1)*x*x/((2*i)*(2*i-1));        sum=sum+term;        ++i;    }    printf("%lf\n",sum);    return 0;}


运行结果




----------------------------------------我----是----昏----割----线(2016.04.07更新)---------------------------------------------

找工作这是生不如狗呀,晚上回来继续我地编程之路


四、另类求和


求Sn=a+aa+aaa+...+aa...a,其中a和n均由键盘输入


代码


/**Copyright (c)2016,刘兵马俑*All rights reserved.*文件名称:main.c*作    者:刘兵马俑*完成日期:2016/04/05*版 本 号:v1.0*问题描述:求Sn=a+aa+aaa+...+aa...a,其中a和n均由键盘输入*程序输出:*/#include <stdio.h>#include <stdlib.h>#include <math.h>int main(){    int a,n,count=1,Sn=0,Tn=0;    printf("请输入 a 和 n 的值:\n");    scanf("%d %d",&a,&n);    while (count<=n)    {        Tn=Tn+pow(10,count-1);        Sn=Sn+a*Tn;        ++count;    }    printf("a+aa+aaa+...=%d\n",Sn);    return 0;}

运行结果






----------------------------------------我----是----昏----割----线(2016.04.11更新)---------------------------------------------


参考了贺利坚老师给的答案之后,发现我的代码运行结果有问题,2222+222+22+2=2468(不是2464),我要搞清楚问题到底出在了哪里,使用单步执行的方式来调试 。我使用的CodeBlocks16.01这个版本,单步执行时,没有看到变量空间,这个要怎么调出来呢?——Watch窗口可以看到变量随程序执行而变化的过程。因此我的提问应该是这样的:CodeBlocks16.01怎样打开Watch窗口?找到答案了,从贺利坚老师写的一篇“CodeBlocks单步调试入门”的教程里找到答案。打开方法如下:

Debug—>Debugging windows—>Watches(即:勾选Watches选项)


我找到了出错的位置了



n=3时,Tn应该等于111,但是程序运算的结果时110,这是为什么呢?我预测问题出在了pow(10,count-1)这个表达式上了,于是跟踪pow(10,count-1)的变化,方法很简单,将pow(10,count-1)赋值给tmp,




编译器计算pow(10,3-1)=99,这就不难解释110的来历了(11+99=110)。难道pow(m,n)不能精确地计算m^n吗?想要 理解这一点,就需要理解pow(m,n)的用法。

pow() 函数用来求 x 的 y 次幂(次方),其原型为:double pow(double x, double y);

所以,错误原因是:自动类型转换导致的,double型赋值给int型。以后要很小心的使用pow(m,n)。

下面是贺利坚老师给出的参考答案:


代码

#include <stdio.h>int main( ){    int a,n,count=1,Sn=0,Tn=0;    printf("请输入 a 和 n 的值:\n");    scanf("%d %d",&a,&n);    while (count<=n)    {        Tn=Tn*10+a;        Sn=Sn+Tn;        count++;    }    printf("a+aa+aaa+...=%d\n",Sn);    return 0;}

运行结果




五、反弹的皮球


题目与要求:一球从的100米高度自由落下,每次落地后反跳回原来高度的一半,再落下,求它在第十次落地时,共经过多少米?第十次反弹多高?


代码:


/**Copyright (c)2016,刘兵马俑*All rights reserved.*文件名称:main.c*作    者:刘兵马俑*完成日期:2016/04/11*版 本 号:v1.0*问题描述:一球从的100米高度自由落下,每次落地后反跳回原来高度的一半,*          再落下,求它在第十次落地时,共经过多少米?第十次反弹多高?*程序输出:s10,h10*/#include <stdio.h>int main( ){    float sn=100.0,hn=sn/2;    int n;    for (n=2; n<=10; n++)    {        sn=sn+2*hn;        hn=hn/2;    }    printf("第10次落地时共经过%f米\n",sn);    printf("第10次反弹%f米\n",hn);    return 0;}

运行结果





----------------------------------------我----是----昏----割----线(2016.04.12更新)---------------------------------------------


六、求Bessel函数的通项Jn(x)


代码


/**Copyright (c)2016,刘兵马俑*All rights reserved.*文件名称:main.c*作    者:刘兵马俑*完成日期:2016/04/12*版 本 号:v1.0*问题描述:对于贝塞尔函数,由任意的n和x≠0求Jn(x)*程序输出:Jn(x)*/#include<stdio.h>#include<math.h>int main(){    printf("请输入n和x:");    int n=0,i;    double x=0.0,J0,J1,Jn,p;    scanf("%d %lf",&n,&x);    J0=sin(x)/x,J1=sin(x)/(x*x)-cos(x)/x;    p=(2*n-1)/x;       //不是(2*n+1)/x    for(i=2;i<=n;++i)  //i的初值为2    {        Jn=p*J1-J0;        J0=J1;        J1=Jn;    }    printf("Jn=%lf\n",Jn);    return 0;}



运行结果





----------------------------------------我----是----昏----割----线(2016.04.17更新)---------------------------------------------



七、贪婪的富翁


代码


/**Copyright (c)2016,刘兵马俑*All rights reserved.*文件名称:main.c*作    者:刘兵马俑*完成日期:2016/04/12*版 本 号:v1.0*问题描述:贪财的富翁*程序输出:*/#include<stdio.h>#include<math.h>int main(){    double pn,rn;//pn表示第n天穷人付给富人的钱,rn表示第n天富人付给穷人的钱    double Pn,Rn;//Pn表示截止第n天穷人一共付给富人多少钱,Rn表示截止第n天富人一共付给穷人多少钱    int n=0;    for(n=1;n<=30;++n)    {        pn=100000,rn=0.1*pow(2,n-1);        Pn=100000*n,Rn=0.1*(pow(2,n)-1);        printf("第%d天穷人付给富人的钱:%lf\n",n,pn);        printf("第%d天富人付给穷人的钱:%lf\n",n,rn);        printf("截止第%d天穷人一共付给富人多少钱:%lf\n",n,Pn);        printf("截止第%d天富人一共付给穷人多少钱:%lf\n",n,Rn);        printf("\n");    }    if(Pn>Rn)        printf("陌生人自找");    else    {        if (Pn<Rn)            printf("富翁傻帽了");        else            printf("两人持平,没意思的交易");    }    printf("\n");    return 0;}


运行结果













1 0
原创粉丝点击