标题:把一元钱分成1分 2分 5分 每种硬币至少8个请问有多少种分法?
只看楼主
luguolian
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2013-4-15
结帖率:100%
已结贴  问题点数:20 回复次数:6 
把一元钱分成1分 2分 5分 每种硬币至少8个请问有多少种分法?
前不久 在湖南省计算机二级考试种遇到一个这样的编程题,当时我的思路是两个for语句的嵌套,我是这么想的
定义四个变量 i j k sum
includu<stdio.h>
void main()
{
 int i,j,k,sum=0;
  for(i=8;;i++)
  {for(j=8;;j++)
  k=100-5*i-2*j;
  if(k>=8)
  sum++;
}
printf("sum=%d",sum);
}
请问各位大神这个程序有什么问题吗?
编译连接都没有出错 但是就是运行不出结果 很纠结啊!
搜索更多相关主题的帖子: 湖南省 
2013-05-31 16:26
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:7 
1分*(8+a) + 2分*(8+b) + 5分*(8+c) = 100分
化简
2b + 5c = 36 - a

for( b=0; b<=18; ++b )
    for( c=0; 2*b+5*c<=36; ++c )
2013-05-31 16:35
xingqiucheng
Rank: 1
等 级:新手上路
帖 子:1
专家分:7
注 册:2013-5-30
得分:7 
貌似无限循环啊!你i,j没有约束条件啊。。。
2013-05-31 16:46
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
昨晚下班了,所以没多说,我给你两段代码,是一样的,自己选一个

程序代码:
#include <stdio.h>
int main()
{
    int n = 0;
    for( int b=0; b*2<=36; ++b )
        n += (36-b*2)/5 + 1;
    printf( "sum=%d", n ); // 80

    return 0;
}

程序代码:
#include <stdio.h>
int main()
{
    int n = 0;
    for( int b=8; 8*1+b*2+8*5<=100; ++b )
        n += (100-8*1-b*2-8*5)/5 + 1;
    printf( "sum=%d", n ); // 80

    return 0;
}

2013-06-01 11:08
ydown
Rank: 2
等 级:论坛游民
帖 子:31
专家分:92
注 册:2013-5-27
得分:7 
回复 楼主 luguolian
1.#include<stdio.h>   这里就2个错误,1.没写#,2.include拼写错误
2.for循环缺少判断,同时语句体里面无结束循环的代码,会造成死循环.
2013-06-01 11:13
ydown
Rank: 2
等 级:论坛游民
帖 子:31
专家分:92
注 册:2013-5-27
得分:0 
程序代码:
//#include<stdio.h>
#include <iostream>
using namespace std;
void main()
{
    int i,j,k,sum=0;    //i为5分的个数,j为2分的个数,k为1分的个数,sum为符合组合的次数.
    for(i=0;i<=7;i++)    //根据5*(8+i)+2*(8+j)+1*(8+k)=100 简化为: 5i+2j+k=36 推算 5分最多7个,2分最多18个,1分最多36个,以此为循环次数
        for(j=0;j<=18;j++)
            for (k=0;k<=36;k++)
            {
                if ((5*i+2*j+1*k)==36) //if((5*(i+8)+2*(j+8)+1*(k+8))==100)   判断条件也可以改成这个,我那个是化简后的,减少循环次数,减少运算时间.
                {
                    cout<<"5*"<<i+8<<"+2*"<<j+8<<"+1*"<<k+8<<"="<<5*(i+8)+2*(j+8)+1*(k+8)<<endl;    //输出并验证.
                    sum++;
                }
            }
    cout<<sum<<endl;    //输出统计数量
    //printf("sum=%d",sum);
}

以上是C++调试,C语言部分被我注释掉了,LZ请自行转换成C语言的引用跟输出代码.

[ 本帖最后由 ydown 于 2013-6-1 11:33 编辑 ]
2013-06-01 11:25
zhu373282183
Rank: 1
等 级:新手上路
帖 子:7
专家分:5
注 册:2013-6-4
得分:0 
硬币的个数应该是有限制的,当然也要计数,当你1分超过100个就要控制跳出循环了
2013-06-04 09:29



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-412674-1-1.html




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

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