fish7fish7 发布留言 2008-7-31 19:55 [非c高手进]帮忙编程解决这两道小学奥数题帮忙编程解决这两道小学奥数题: 1、现有1角币1张,2角币1张,5角币1张,1元币4张,5元币2张。用这些钱可以付出不同的各种数额的币值有多少种? 2、把5040分拆成4个不同自然数的乘积,使这几个数的和为最小,若分成6个自然数的乘积呢? [ 本帖最后由 fish7fish7 于 2008-8-3 17:55 编辑 [/it]] 卧龙孔明 发布留言 2008-7-31 19:58 第一个,dp 第二个,简单的分解和枚举... fish7fish7 发布留言 2008-7-31 19:59 dp什么意思?不懂![tk12] 卧龙孔明 发布留言 2008-7-31 20:00 面对楼主这种标题,我不想回答 我不想当所谓的“高手” 因为我是版主,我尽责任来看一下帖子 fish7fish7 发布留言 2008-7-31 20:00 第二个我这么编的,不知道为什么不对,高手指点!#include void main() {long int a,b,c,d,e,f,g,h,i,min=9999999; for(a=1;a<=5040;a++) for(b=1;b<=5040;b++) for(c=1;c<=5040;c++) for(d=1;d<=5040;d++) if(a*b*c*d==5040&&a!=b&&b!=c&&c!=d&&a!=c&&a!=d&&b!=d) { e=a+b+c+d; if(e{min=e; f=a; g=b; h=c; i=d; } } printf("min=%.ld\n",min); printf("%d\n",f); printf("%d\n",g); printf("%d\n",h); printf("%d\n",i); }fish7fish7 发布留言 2008-8-2 19:08 不懂就问[tk09]fish7fish7 发布留言 2008-8-2 19:18 好不容易写的程序,没人理吗?[tk09]fish7fish7 发布留言 2008-8-3 11:35 继续问,坚持到底……[tk05]fish7fish7 发布留言 2008-8-3 12:36 爱答不答,爱看不看,不懂就问……[tk09] [tk09] [tk09]Rand 发布留言 2008-8-3 13:59 LZ还是没看过 提问的智慧 !elan1986 发布留言 2008-8-3 14:12 版主很生气 后果很.......fish7fish7 发布留言 2008-8-3 16:35 我看过提问的智慧,而且回复了,为求真理,我不管斑竹气不气……[tk09] [tk09] [tk09] [tk09] [tk09] [tk09] [tk09] [tk09]广陵绝唱 发布留言 2008-8-3 17:01 第一题,谨作参考。 [code]/*******************************************************************************
现有1角币1张,2角币1张,5角币1张,1元币4张,5元币2张。用这些钱可以 付出不同的各种数额的币值有多少种.
根据题意写出这个程序,也不知道结果对不对,程序的思维也有些乱,还请大家 多多指教。谢谢。
*******************************************************************************/ #include int jianche(float *p,int k) { int i,j; int fanhui=1; for(i=0;i for(j=i+1;j if(p) return fanhui=0; return fanhui; } int main(void) { float jiao[8]={0.0,0.1,0.2,0.3,0.5,0.6,0.7,0.8}; /* 角钱可能出现的币值 */ float yuan_1=1.0,yuan_5=5.0; /* 元钱 */ float zhong[200];/* 总额,用于检测是否有相同数值出现 */ int i,j,k,jishu=0; for(i=0;i<8;i++) for(j=0;j<5;j++) for(k=0;k<3;k++) { if(!(i+j+k)) continue; zhong[jishu]=jiao!=0.0) printf("总额%.2f=一元%d张+五元%d张+角%.2f元 ", zhong[jishu],j,k,i); else continue; if(!(jishu%2)) puts(""); jishu++; } printf("\n共有%d种付币方法\n",jishu); getch(); } [/code] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`
第二题,我也不会,不过我在CSDN上发帖正在期待解决。我想,如果单纯的嵌套循环,太没有效率了;这题应该用别的方法可以解决的。有位朋友的方法是把5040分解成不同的质数,成为一个链表,如果有相同的数值,再从前面开始两两相加,如果它们的和没有相同的数值,就加入到链表中合适的位置;如果有相同的,就再和别的数值相加。5040分解成6个不相同的自然数的结果是:2 3 4 5 6 7。
说起来简单,对于我这样的新手来说,十分复杂。然后这题如果扩展一下,用户输入一定范围内的任意自然数,然后输入分解个数,如果程序分解成功,找到最佳值打印;如果分解不成功,打印提示信息。这样的效果可以作出来吗?
同样期待高手来解决。fish7fish7 发布留言 2008-8-3 17:22 非常感激楼上的这位热心的朋友,经本人运行,结果是完全正确的,我要仔细学习一下你的这个程序,太棒了,真的,你比那些冒牌斑竹都强,你真是我的大恩人啊……^.^[tk04] [tk04] [tk04] [tk04] [tk04] [tk04] [tk04] [tk04] [tk04] [tk04] [tk04] [tk04] [tk04] [tk04] [tk04] [tk04] [tk04]
[ 本帖最后由 fish7fish7 于 2008-8-3 19:11 编辑 [/it]]呆呆的出行者 发布留言 2008-8-3 17:22 看看你造的4个数吧 a=64,b=3129,c=1,d=0 a=64,b=3129,c=1,d=0 a=64,b=3129,c=1,d=0 a=64,b=3129,c=1,d=0 a=64,b=3129,c=1,d=0 a=64,b=3129,c=1,d=0 a=64,b=3129,c=1,d=0 a=64,b=3129,c=1,d=0 a=64,b=3129,c=1,d=0 a=64,b=3129,c=1,d=0 a=64,b=3129,c=1,d=0 a=64,b=3129,c=1,d=0 a=64,b=3129,c=1,d=0 a=64,b=3129,c=1,d=0 a=64,b=3129,c=1,d=0 a=64,b=3129,c=1,d=0 a=64,b=3129,c=1,d=0 a=64,b=3129,c=1,d=0 a=64,b=3129,c=1,d=0 a=64,b=3129,c=1,d=0 a=64,b=3129,c=1,d=0 a=64,b=3129,c=1,d=0 a=64,b=3129,c=1,d=0 a=64,b=3129,c=1,d=0呆呆的出行者 发布留言 2008-8-3 17:22 这是嘛玩意fish7fish7 发布留言 2008-8-3 17:32 请楼上的这位朋友帮我改错,谢谢^.^[tk04] [tk04] [tk04]fish7fish7 发布留言 2008-8-3 19:15 尽管广陵绝唱是俺的大恩人,但还是要修正一些错误!(不好意思啦)我改正后及简化后的程序如下,声明:我也只是个beginner,还请各位路过的高手不要见笑,多多指教! [code]#include"stdio.h" int jiance(float *p,int k) { int i; int fanhui=1; for(i=0;i return fanhui; } int main(void) { float jiao[8]={0.0f,0.1f,0.2f,0.3f,0.5f,0.6f,0.7f,0.8f}; /* 角钱可能出现的币值 */ float yuan_1=1.0,yuan_5=5.0; /* 元钱 */ float zong[200];/* 总额,用于检测是否有相同数值出现 */ int i,j,k,count=0; for(i=0;i<8;i++) for(j=0;j<5;j++) for(k=0;k<3;k++) { zong[count]=jiao!=0.0) {printf("总额%.2f=一元%d张+五元%d张+角%.2f元\t", zong[count],j,k,jiao
[ 本帖最后由 fish7fish7 于 2008-8-3 20:53 编辑 [/it]]广陵绝唱 发布留言 2008-8-3 21:40 谢楼主改错根据第2题,结合自己的水平,用四重for写了下面这么个程序,但是运行无结果,也许是运算次数太多?希望“非高手”的高手们帮指点一下,谢谢。 [code]/*******************************************************************************
把5040分拆成4个不同自然数的乘积,使这几个数的和为最小
~~~~~~~~~~~~~~~~~~~~~~~~~~
按照题意,编写了这么个程序,可是运行起来十分让人恼火, 好几分钟了都不出结果,可能是for嵌套太多的原因吧?
还是希望哪位高手写出别样的程序来吧。
*******************************************************************************/ #include int main(void) { int f=5040; int k=1260; /* 因为分解成为4个数,所以最小值的出现应该不是在1/4范围外*/ int h[5]={1260,1260,1260,1260,5040};/*作为存放数值以及比较大小来用,所以赋初值是最大值840*/ int a,b,c,d; for(a=1;a<=k;a++) for(b=1;b<=k;b++) for(c=1;c<=k;c++) for(d=1;d<=k;d++) if(a!=b&&a!=c&&a!=d&&b!=c&&b!=d&&c!=d&&(a*b)*(c*d)==f) if(h[4]>(a+b)+(c+d)) { h[0]=a;h[1]=b;h[2]=c;h[3]=d; h[4]=(a+b)+(c+d); } printf("a=%d,b=%d,c=%d,d=%d",h[0],h[1],h[2],h[3]); getch(); }[/code]
ps:对不起,由于昨天总想着解6个数的了,所以把最大值写错了,现在改为1260。实在对不起。
[ 本帖最后由 广陵绝唱 于 2008-8-3 22:13 编辑 [/it]]爱喝牛奶的猫咪 发布留言 2008-8-3 22:04 840^4 = 497 871 360 000,果然有趣
< >
页: [1] 特别说明:如网页特效代码中有引用图片文件等,请自己下载到本地调试! |