论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

C趣味程序百例(05)

文章类别:C语言程序设计 | 发表日期:2008-9-24 14:44:53


14.怎样存钱利最大
15.捕鱼和分鱼
16.出售金鱼 
   




14.怎样存钱利最大
    假设银行整存整取存款不同期限的月息利率分别为:
            0.63%     期限=1年
            0.66%     期限=2年
            0.69%     期限=3年
            0.75%     期限=5年
            0.84%     期限=8年
    利息=本金*月息利率*12*存款年限。
    现在某人手中有2000元钱,请通过计算选择一种存钱方案,使得钱存入银行20年后得到的利息最多(假定银行对超过存款期限的那一部分时间不付利息)。
*问题分析与算法
    为了得到最多的利息,存入银行的钱应在到期时马上取出来,然后马上将原来的本金和利息加起来再作为新的本金存入银行,这样不断地滚动直到满20年为止,由于存款的利率不同,所以不同的存款方法(年限)存20年得到的利息是不一样的。
    分析题意,设2000元存20年,其中1年存i1次,2年存i2次,3年存i3次,5年存i5次,8年存i8次,则到期时存款人应得到的本利合计为:
    2000*(1+rate1)i1*(1+rate2)i2*(1+rate3)i3*(1+rate5)i5*(1+rate8)i8
其中rateN为对应存款年限的利率。根据题意还可得到以下限制条件:
    0<=i8<=2
    0<=i5<=(20-8*i8)/5
    0<=i3<=(20-8*i8-5*i5)/3
    0<=i2<=(20-8*i8-5*i5-3*i3)/2
    0<=i1=20-8*i8-5*i5-3*i3-2*i2
    可以用穷举法穷举所有的i8、i5、i3、i2和i1的组合,代入求本利的公式计算出最大值,就是最佳存款方案。
*程序与程序注释
#include<stdio.h>
#include<math.h>
void main()
{
    int i8,i5,i3,i2,i1,n8,n5,n3,n2,n1;
    float max=0,term;
    for(i8=0;i8<3;i8++)       /*穷举所有可能的存款方式*/
        for(i5=0;i5<=(20-8*i8)/5;i5++)
            for(i3=0;i3<=(20-8*i8-5*i5)/3;i3++)
                for(i2=0;i2<=(20-8*i8-5*i5-3*i3)/2;i2++)
                {
                    i1=20-8*i8-5*i5-3*i3-2*i2;
                    term=2000.0*pow((double)(1+0.0063*12),(double)i1)
                               *pow((double)(1+2*0.0063*12),(double)i2)
                               *pow((double)(1+3*0.0069*12),(double)i3)
                               *pow((double)(1+5*0.0075*12),(double)i5)
                               *pow((double)(1+8*0.0084*12),(double)i8);
                                            /*计算到期时的本利合计*/
                     if(term>max)
                     {
                          max=term;n1=i1;n2=i2;n3=i3;n5=i5;n8=i8;
                     }
                }
    printf("For maxinum profit,he should so save his money in a bank:\n");
    printf("   made fixed deposit for 8 year: %d times\n",n8);
    printf("   made fixed deposit for 5 year: %d times\n",n5);
    printf("   made fixed deposit for 3 year: %d times\n",n3);
    printf("   made fixed deposit for 2 year: %d times\n",n2);
    printf("   made fixed deposit for 1 year: %d times\n",n1);
    printf("                            Toal: %.2f\n",max);
                                                /*输出存款方式*/
}
*运行结果
For maxinum profit,he should so save his money in a bank:
    made fixed deposit for 8 year: 0times
    made fixed deposit for 5 year: 4times
    made fixed deposit for 3 year: 0times
    made fixed deposit for 2 year: 0times
    made fixed deposit for 1 year: 0times
                Total:8841.01
    可见最佳的存款方案为连续四次存5年期。

*思考题
    某单位对职工出售住房,每套为2万元。买房付款的方法是:
    一次交清,优惠20%
    从第一年开始,每年年初分期付款:
        5年交清,优惠50%;
        10年交清,优惠10%;
        20年交清,没有优惠。
    现在有人手中正好有2万元,若假定在今后20年中物价和银行利率均保持不变,问他应当选择哪种付款方式可以使应付的钱最少?

-------------------------------------------------------------------

15.捕鱼和分鱼
    A、B、C、D、E五个人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。日上三杆,A第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。B第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉,保持走自己的一份。C、D、E依次醒来,也按同样的方法拿走鱼。问他们合伙至少捕了多少条鱼?
*问题分析与算法设计
    根据题意,总计将所有的鱼进行了五次平均分配,每次分配时的策略是相同的,即扔掉一条鱼后剩下的鱼正好分成五份,然后拿走自己的一份,余下其它的四份。
    假定鱼的总数为X,则X可以按照题目的要求进行五次分配:X-1后可被5整除,余下的鱼为4*(X-1)、5。若X满足上述要求,则X就是题目的解。
*程序与程序注释
#include<stdio.h>
void main()
{
    int n,i,x,flag=1;          /*flag:控制标记*/
    for(n=6;flag;n++)          /*采用试探的方法。令试探值n逐步加大*/
    {
        for(x=n,i=1&&flag;i<=5;i++)
            if((x-1)%5==0) x=4*(x-1)/5;
            else  flag=0;              /*若不能分配则置标记falg=0退出分配过程*/
        if(flag) break;              /*若分配过程正常结束则找到结果退出试探的过程*/
        else flag=1;                  /*否则继续试探下一个数*/
    }
    printf("Total number of fish catched=%d\n",n);     /*输出结果*/
}
*运行结果
    Total number of fish catched = 3121
*问题的进一步讨论
    程序采用试探法,试探的初值为6,每次试探的步长为1。这是过分保守的做法。可以在进一步分析题目的基础上修改此值,增大试探的步长值,以减少试探次数。
*思考题
    请使用其它的方法求解本题。

-------------------------------------------------------------

16.出售金鱼
   
买卖提将养的一缸金鱼分五次出售系统上一次卖出全部的一半加二分之一条;第二次卖出余下的三分之一加三分之一条;第三次卖出余下的四分之一加四分之一条;第四次卖出余下的五分之一加五分之一条;最后卖出余下的11条。问原来的鱼缸中共有几条金鱼?
*题目分析与算法设计
    题目中所有的鱼是分五次出售的,每次卖出的策略相同;第j次卖剩下的(j+1)分之一再加1/(j+1)条。第五次将第四次余下的11条全卖了。
    假定第j次鱼的总数为X,则第j次留下:
                x-(x+1)/(j+1)
当第四次出售完毕时,应该剩下11条。若X满足上述要求,则X就是题目的解。
    应当注重的是:"(x+1)/(j+1)"应满足整除条件。试探X的初值可以从23开始,试探的步长为2,因为X的值一定为奇数。
*程序说明与注释
#include<stdio.h>
void main()
{
    int i,j,n=0,x;                     /*n为标志变量*/
    for(i=23;n==0;i+=2)               /*控制试探的步长和过程*/
    {
        for(j=1,x=i;j<=4&&x>=11;j++)  /*完成出售四次的操作*/
            if((x+1)%(j+1)==0)        /*若满足整除条件则进行实际的出售操作*/
                x-=(x+1)/(j+1);
            else {x=0;break;}         /*否则停止计算过程*/
        if(j==5&&x==11)            /*若第四次余下11条则满足题意*/
        {
            printf("There are %d fishes at first.\n",i);          /*输出结果* /
            n=1;                                          /*控制退出试探过程*/
        }
    }
}
*运行结果
    There are 59 fishes at first.

*思考题
    日本闻名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。分完后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?


           

上一篇:{实例}C趣味程序百例(04) 人气:5768
下一篇:{实例}C趣味编程百例(06) 人气:7404
视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058