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

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






项目一 【另类求和】

    求 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值