| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5334 人关注过本帖
标题:【此帖作废】[非c高手进]帮忙编程解决这两道小学奥数题
只看楼主 加入收藏
elan1986
Rank: 6Rank: 6
等 级:贵宾
威 望:18
帖 子:458
专家分:407
注 册:2007-12-17
收藏
得分:0 
版主很生气
后果很.......
2008-08-03 14:12
fish7fish7
Rank: 1
等 级:新手上路
威 望:1
帖 子:145
专家分:0
注 册:2008-7-31
收藏
得分:0 
我看过提问的智慧,而且回复了,为求真理,我不管斑竹气不气……
2008-08-03 16:35
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
第一题,谨作参考。
程序代码:
/*******************************************************************************

     现有1角币1张,2角币1张,5角币1张,1元币4张,5元币2张。用这些钱可以
  付出不同的各种数额的币值有多少种.


    根据题意写出这个程序,也不知道结果对不对,程序的思维也有些乱,还请大家

 多多指教。谢谢。

*******************************************************************************/
#include<stdio.h>
int jianche(float *p,int k)
{
        int i,j;
        int fanhui=1;
        for(i=0;i<k;i++)
                for(j=i+1;j<k;j++)
                        if(p[i]==p[j])  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[i]+yuan_1*j+yuan_5*k;
                                if((jianche(zhong,jishu))&&zhong[jishu]!=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();
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`

    第二题,我也不会,不过我在CSDN上发帖正在期待解决。我想,如果单纯的嵌套循环,太没有效率了;这题应该用别的方法可以解决的。有位朋友的方法是把5040分解成不同的质数,成为一个链表,如果有相同的数值,再从前面开始两两相加,如果它们的和没有相同的数值,就加入到链表中合适的位置;如果有相同的,就再和别的数值相加。5040分解成6个不相同的自然数的结果是:2 3 4 5 6 7。

    说起来简单,对于我这样的新手来说,十分复杂。然后这题如果扩展一下,用户输入一定范围内的任意自然数,然后输入分解个数,如果程序分解成功,找到最佳值打印;如果分解不成功,打印提示信息。这样的效果可以作出来吗?

    同样期待高手来解决。
2008-08-03 17:01
fish7fish7
Rank: 1
等 级:新手上路
威 望:1
帖 子:145
专家分:0
注 册:2008-7-31
收藏
得分:0 
非常感激楼上的这位热心的朋友,经本人运行,结果是完全正确的,我要仔细学习一下你的这个程序,太棒了,真的,你比那些冒牌斑竹都强,你真是我的大恩人啊……^.^

[[it] 本帖最后由 fish7fish7 于 2008-8-3 19:11 编辑 [/it]]
2008-08-03 17:22
呆呆的出行者
Rank: 1
等 级:新手上路
帖 子:125
专家分:0
注 册:2007-9-17
收藏
得分:0 
看看你造的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

Made in China!
2008-08-03 17:22
呆呆的出行者
Rank: 1
等 级:新手上路
帖 子:125
专家分:0
注 册:2007-9-17
收藏
得分:0 
这是嘛玩意

Made in China!
2008-08-03 17:22
fish7fish7
Rank: 1
等 级:新手上路
威 望:1
帖 子:145
专家分:0
注 册:2008-7-31
收藏
得分:0 
请楼上的这位朋友帮我改错,谢谢^.^
2008-08-03 17:32
fish7fish7
Rank: 1
等 级:新手上路
威 望:1
帖 子:145
专家分:0
注 册:2008-7-31
收藏
得分:0 
尽管广陵绝唱是俺的大恩人,但还是要修正一些错误!(不好意思啦)
我改正后及简化后的程序如下,声明:我也只是个beginner,还请各位路过的高手不要见笑,多多指教!
程序代码:
#include"stdio.h"
int jiance(float *p,int k)
{
        int i;
        int fanhui=1;
        for(i=0;i<k-1;i++) if(p[i]==p[k-1]) fanhui=0;
        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[i]+yuan_1*j+yuan_5*k;
                                if((jiance(zong,count))&&zong[count]!=0.0)
                                {printf("总额%.2f=一元%d张+五元%d张+角%.2f元\t",
                                zong[count],j,k,jiao[i]);count++;}
                        }
        printf("\n\n共有%d种付币方法\n",count);
        getchar();
}


[[it] 本帖最后由 fish7fish7 于 2008-8-3 20:53 编辑 [/it]]
2008-08-03 19:15
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
谢楼主改错
根据第2题,结合自己的水平,用四重for写了下面这么个程序,但是运行无结果,也许是运算次数太多?希望“非高手”的高手们帮指点一下,谢谢。
程序代码:
/*******************************************************************************

        把5040分拆成4个不同自然数的乘积,使这几个数的和为最小

~~~~~~~~~~~~~~~~~~~~~~~~~~

        按照题意,编写了这么个程序,可是运行起来十分让人恼火,
    好几分钟了都不出结果,可能是for嵌套太多的原因吧?

        还是希望哪位高手写出别样的程序来吧。

*******************************************************************************/
#include<stdio.h>
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();
}



ps:对不起,由于昨天总想着解6个数的了,所以把最大值写错了,现在改为1260。实在对不起。

[[it] 本帖最后由 广陵绝唱 于 2008-8-3 22:13 编辑 [/it]]
2008-08-03 21:40
爱喝牛奶的猫咪
Rank: 1
来 自:QQ群46520219
等 级:禁止访问
帖 子:513
专家分:0
注 册:2008-6-16
收藏
得分:0 
840^4 = 497 871 360 000,果然有趣

[color=white]<" border="0" />>
2008-08-03 22:04
快速回复:【此帖作废】[非c高手进]帮忙编程解决这两道小学奥数题
数据加载中...
 
   



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

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