| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2070 人关注过本帖, 2 人收藏
标题:这个C程序谁能编出来啊?
只看楼主 加入收藏
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:0 
回复 10楼 hsjjgm
e   先给你分析下问题;
题目中五种存款方式我们切用 f1 f2 f3 f5 f8 表示,就拿你的样例输入来说,输入:20
接下来我们就要处理这个 20 了,是根据题目要求的“最佳方案”来处理
何谓最佳方案,20年,怎么存呢? 可以是存 20 次 f1,可以是 1次 f1,1次 f3,2次 f8;  还可以是 4 次 f5....
可见有多种方案,我们要做的就是在这多种方案中找出“最佳方案”

我的程序的主要思路:
1、就是那五个循环;作用是求方案的组合形式;
2、就是求本息和的 Getsum 函数;
注意:一种方案下,存款方式的顺序对结果无影响,
程序代码:
[color=#0000FF]#include<stdio.h>
double Getsum(int[],int[],double[]);//定义一个函数Getsum,用来求某种存款方式的本息和;
main()
{
    int N,i,j,k,l,m,n,a[5],b[5]={1,2,3,5,8},d[5];
    double sum,max=0,c[5]={0.0063,0.0066,0.0069,0.0075,0.0084};
    printf("请输入存多少年:");
    scanf("%d",&N);
    for(i=0;i<=N;i++)     
        for(j=0;j<N;j++)
            for(k=0;k<=N;k++)
                for(l=0;l<=N;l++)
                    for(m=0;m<=N;m++)
                    {
                        if(i+j*2+k*3+l*5+m*8==N)  //这个以及上面面的五个循环是用来求 对于几种存款方式的组合形式,然后汇总与这个if语句来判断,比如说我存8年,可以使1 2 5,可以是3 5,或8个1....
                        {
                            a[0]=i;a[1]=j;a[2]=k;a[3]=l;a[4]=m;//i~m分别是1 2 3 5 8五种存款方式的次数,分别把值赋给a[0]~a[4]
                            sum=Getsum(a,b,c);    //a,b,c三个数组 作参数带入函数Getsum,并由sum接收函数的返回值(也就是本息和)
                            if(sum>max)           //因为你输入一个存款年份,肯定有很多种方案,所以每产生一个sum就比较一次,留下最大的sum,也即是最佳方案
                            {
                                max=sum;
                                for(n=0;n<5;n++) //这个for语句是用来存储最佳方案下的五种存款方式的各自次数,可有可无
                                    d[n]=a[n]; 
                            }
                        }          
                    }
    printf("最佳方案:先存一年期%d次,再二年期%d次,三年期%d次,五年期%d次,最后八年期%d次\n最佳方案下的本息和:%.2lf\n",d[0],d[1],d[2],d[3],d[4],max);
    return 0;
}

double Getsum(int a[],int b[],double c[])
{
    int i,j;
    double sum1=2000;
    for(i=0;i<5;i++)    //由此开始求本息和,这是外层循环,i有五个值,分别表示五种存款方式
        for(j=1;j<=a[i];j++) //内层循环,a[i]表示这种存款方式的存款次数,所以从 f1 开始累积本息和 ,(存款方式的顺序对结果无影响)
            sum1+=sum1*c[i]*12*b[i];  //本息和公式
    return sum1;        //返回本息和
}

[/color]

[ 本帖最后由 韶志 于 2013-5-26 10:17 编辑 ]

三十年河东,三十年河西,莫欺少年穷!
2013-05-25 21:25
wangzhili
Rank: 1
等 级:新手上路
帖 子:13
专家分:6
注 册:2013-5-16
收藏
得分:0 
自己想想,不难
2013-05-25 21:39
我有我梦
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:321
专家分:1128
注 册:2013-5-25
收藏
得分:0 
高手如云啊!!!!
2013-05-25 22:46
liu0919
Rank: 2
等 级:论坛游民
帖 子:124
专家分:35
注 册:2013-5-13
收藏
得分:0 
加油
2013-05-25 22:54
hsjjgm
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:106
专家分:189
注 册:2013-4-27
收藏
得分:0 
哦,谢谢指教
虽然还不是很懂,mark下,慢慢琢磨
2013-05-26 00:06
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
以下是引用韶志在2013-5-25 21:25:53的发言:
注意:比如说存20年,用“1 f1,1 f3,2 f8”这种方案来求,那么必须是先存 f1 1年,再存 f3 1年,最后存 f8 2次一共16年
   不能是先存 f8 ,再 f3,最后 f1;或者先 f3,再 f8 ,最后 f1,;   必须是由小的存款年限到大的存款年限(这是定理,你可以自己验证一下,不必钻这个牛角尖


要是能解释清楚这个“定理”,我送你100专家分。别人回答一样送分。

还有,谁第一个正确得出存1000年的本息和,我送100专家分。

重剑无锋,大巧不工
2013-05-26 08:31
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:0 
回复 16楼 beyondyf
谢谢前辈指点,我所说的“定理”自己没有仔细验证,现在想想确实是错的

应该是同一方案下,结果与不同存款方式的组合顺序无关,不过这对我的程序无影响

我还是学生没那么大能耐,请谅解;

还有,我也知道我的程序的缺点,就是运行速度问题...或者说效率,目前还没找到好的解决方法,若果你有的话,不妨拿出来与大家分享

错误的地方原帖已修改

三十年河东,三十年河西,莫欺少年穷!
2013-05-26 10:28
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
呵呵,感觉我又伤了一个小兄弟。我想强调,编程,严谨至关重要。我们的目的不是得到一个结果,而是得到一个正确的结果。错误的结果往往比没有结果还要糟糕。

存款方式的顺序确实不影响最终的本息和。关于这一点的证明虽然简单,但还是建议你实际的证明一下,这对提高分析能力是有帮助的。

关于程序的效率,你的算法其实就是穷举所有的方案,在目前的计算机架构下确实效率太低,时间复杂度是O(n^m)。这里n是存款年限,m是存款方式。

昨天我还在“将军鬼上身”的帖子里聊到动态规划的广范应用,这题又是一个典型案例,不妨顺着这个思路好好想想。时间复杂度是O(n*m)。

重剑无锋,大巧不工
2013-05-26 22:21
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:0 
回复 18楼 beyondyf
多谢  呵呵   加这个论坛的目的就是学习

三十年河东,三十年河西,莫欺少年穷!
2013-05-27 11:24
我叫沃恩
Rank: 12Rank: 12Rank: 12
来 自:Asia
等 级:贵宾
威 望:10
帖 子:1234
专家分:3865
注 册:2013-3-29
收藏
得分:0 
学习!!

因为我是菜鸟,所以应该被骂! 细节+坚持=成功!
2013-05-27 12:36
快速回复:这个C程序谁能编出来啊?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018197 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved