第三十五课 问题求解方法——迭代 【项目1-5】

来源:互联网 发布:药品入库软件 编辑:程序博客网 时间:2024/05/21 17:08

第三十五课 问题求解方法——迭代






项目一 【另类求和】

    求 Sn=a+aa+aaa+...+aa...a之值,其中 a是一个数字。
例如2+22+222+2222( 此时a=2,n=4),a和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米高度自由落下,每次落地后反跳回原来高度的一半,再落下,求它在第十次落地时,共经过多少米?第十次反弹多高?
请在下面的代码基础上补充完整。

代码:

#include<stdio.h>int main(){    float sn=100.0,hn=sn/2;    int n;    for (n=2;n<=10;n++)    {        sn=sn+hn*2;        hn=hn/2;    }    printf("第10次落地时共经过%f米。\n",sn);    printf("第10次反弹%f米。\n",hn);    return 0;}

运行结果:






项目三 【Bessel函数】
    Bessel函数Jn(X)有以下的递推关系:


 编写程序,利用递推关系,由任意的n和x≠0求Jn(X)。

代码:

#include<stdio.h>#include<math.h>int main(){    double jn,j1,j0,x;    int n,count=2;    printf("请输入x和n:\n");    scanf ("%lf%d",&x,&n);    j0=sin(x)/x;    j1=sin(x)/(x*x)-cos(x)/x;    while (count<=n)    {        jn=(2*count-1)/x*j1-j0;        j0=j1;        j1=jn;        count++;    }    printf("%4f",jn);    return 0;}

运行结果:






项目四 【贪财的富翁】

     一个百万富翁遇到一个陌生人,陌生人找他谈一个换钱的计划,该计划如下:我每天给你十万元,而你第一天只需给我一分钱,第二天我仍给你十万元,你给我两分钱,第三天我仍给你十万元,你给我四分钱,....,你每天给我的钱是前一天的两倍,直到满一个月(30天),百万富翁很高兴,欣然接受了这个契约。请编程序,通过计算说明,这个换钱计划对百万富翁是否是个划算的交易。

提示:(1)需要计算出30天后陌生人给了百万富翁多少钱,百万富翁给了陌生人多少钱,然后才能做出判断;(2)想要看得清楚,可以选择列出每一天双方交易获得的钱数。


代码:

#include<stdio.h>int main(){    int i=1,t1=100000,sum1=0;    double sum2=0.0,t2=0.01;    while (i<=30)    {        sum1=sum1+t1;        sum2=sum2+t2;        t2=t2*2;        printf("第%d天,富翁得到%d,陌生人得到%.2f\n",i,sum1,sum2);        i++;    }    if (sum1>sum2)            printf("\n富翁稳赚");    else    {        if (sum1<sum2)            printf ("\n陌生人稳赚");        else        printf("\n公平交易");    }    return 0;}



运行结果:







项目五 【在北京买房】

    现在北京有一套房子,价格200万,假设房价每年上涨10%,一个软件工程师每年固定能赚40万。如果他想买这套房子,不贷款,不涨工资,没有其他收入,每年不吃不喝不消费,那么他需要几年才能攒够钱买这套房子? 

代码:

#include<stdio.h>int main(){    int i=1,t2=400000;    double s1=2000000.0,s2=0.0,t1=0.0;    while (i<=80)    {        s1=s1+t1;        t1=s1*0.1;        s2=s2+t2;        printf ("第%d年,房价%.0f,积蓄%.0f\n",i,s1,s2);        i++;    }    if (s1<s2)        printf("%d年后,终于等到你。。\n",i);    else        printf("来世再努力吧!\n");        return 0;}

运行结果:







扩展1:

    这位软件工程师没有理财意识,不去投资,也不至于将现金堆在家里吧,至少应存到银行,吃点利息(考虑通胀因素,可能仍亏,但比放家里现金收益高也安全)。按存1年定期,重新求解上面的问题。


代码:

#include<stdio.h>int main(){    int i=1,t2=400000;    double s1=2000000.0,s2=0.0,t1=0.0,j2=0.0;    while (i<=80)    {        s1=s1+t1;        t1=s1*0.1;        j2=s2*0.015;        s2=s2+t2+j2;        printf ("第%d年,房价%.0f,积蓄%.0f\n",i,s1,s2);        i++;    }    if (s1<s2)        printf("%d年后,终于等到你。。\n",i);    else        printf("来世再努力吧!\n");        return 0;}

运行结果:





扩展2:

    软件工程师不涨工资不对。工作经验、效率逐年提高,这家公司不给涨,会找另一家给涨工资的公司做。假如每年工资涨5%,结果又是如何呢?

代码:

#include<stdio.h>int main(){    int i=1,t2=400000;    double s1=2000000.0,s2=0.0,t1=0.0;    while (i<=80)    {        s1=s1+t1;        t1=s1*0.1;        s2=s2+t2;        t2=s2*1.05;        printf ("第%d年,房价%.0f,积蓄%.0f\n",i,s1,s2);        i++;    }    if (s1<s2)        printf("%d年后,终于等到你。。\n",i);    else        printf("来世再努力吧!\n");        return 0;}

运行结果:


不知道对不对啊,为什么怎样都买不到房啊。。。泪飘。。






知识点与总结:


     1迭代真的太精细了,把一些有关联的数据组成可代替的关系式,就形成了迭代的体系,一个解法也许有很多种,但是要找到一个精简又精确的就少了,应该多在这方面下功夫。

    2、为了每次循环输出结果,可以把初值设置成0,或者在 printf 输出后的下一行进行 i++ 。

    3、如果迭代的第一次循环把第二次的数据算进去了,可能是循环过程中迭代或循环体的位置靠前了,适当调整到输出的那个变量的后面。





















132

1 0