标题:用C语言编程.最好有注释.100元人民币,换成一元、五角、一角、五分,每种硬币 ...
只看楼主
_Strike
Rank: 2
等 级:论坛游民
帖 子:133
专家分:72
注 册:2016-3-22
结帖率:90.63%
已结贴  问题点数:20 回复次数:7 
用C语言编程.最好有注释.100元人民币,换成一元、五角、一角、五分,每种硬币个数大于0,且为5的倍数,请问有几种换法?
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int money=100;//1元为100分
    int i,j,k,count=0;
    for(k=5;k<money;k+=5)
        for(j=2;j<money;j+=2)
        for(i=i;i<money;i++)
    {
        if(((i+j+k)==100)&&(i%5==0)&&(j%5==0)&&(k%5==0))
        count++;
    }
        printf("%d",count);
        return 0;
}
搜索更多相关主题的帖子: 人民币 include C语言 money count 
2016-07-02 14:54
_Strike
Rank: 2
等 级:论坛游民
帖 子:133
专家分:72
注 册:2016-3-22
得分:0 
应该是算法有问题,请问怎么改,或者直接写过一个算法
2016-07-02 14:55
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
得分:20 
一元、五角、一角、五分是4个参数,而你才三个参数。
每种硬币个数大于0,且为5的倍数
double i,j,k,l,count=0;
for(i=5;i<100;i+=5)      
    for(j=2.5;j<100;j+=2.5)  
        for(k=0.5;k<100;k+=0.5)
            for(l=0.25;l<100;l+=0.25)
                if((i+j+k+l)==100) count++;
这样就行了。你试试看吧
估计你看的懂。
记住输出格式改下。
2016-07-02 19:28
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
程序代码:
#include <stdio.h>

int main( void )
{
    // 20a + 10b + 2c + 1d = 367
    unsigned count = 0;
    for( unsigned a=0; a<=367; a+=20 )
        for( unsigned b=0; a+b<=367; b+=10 )
            for( unsigned c=0; a+b+c<=367; c+=2 )
                ++count;
    printf( "%u\n", count ); // 23389

    return 0;
}
2016-07-04 09:15
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
得分:0 
回复 4楼 rjsp

没有想到,换个角度计算,计算的次数少了不知道多少。
2016-07-04 10:22
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
回复 5楼 linlulu001
还可以优化
程序代码:
#include <stdio.h>

int main( void )
{
    // 20a + 10b + 2c + 1d = 367
    // 20a + 10b + 2c <= 367
    // 10a + 5b + c <= 183
    unsigned count = 0;
    for( unsigned a=0; a<=183; a+=10 )
        for( unsigned b=0; a+b<=183; b+=5 )
            count += (183-a-b)+1;
    printf( "%u\n", count ); // 23389

    return 0;
}
当然,还可以继续优化
收到的鲜花
  • linlulu0012016-07-04 11:20 送鲜花  5朵  
2016-07-04 10:58
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
得分:0 
今天看到这段代码上了一课,相同的结果,不同的算法,效率相差太多了。
不知道大神能不能推荐适合新人学习的算法的书。
2016-07-04 11:21
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
我没看过什么算法的书,《算法导论》我自己都没看过,因此也就不装大尾巴狼推荐给你了

程序代码:
#include <stdio.h>

int main( void )
{
    // 20a + 10b + 2c + 1d = 367
    // 对于 2c + 1d = n 的解数目是 n/2+1
    // 对于 10b + 2c + 1d = n 的解数目就是个 等差数列就和
    unsigned count = 0;
    for( unsigned a=0; a<=367; a+=20 )
        count += ( (367-a)/2+1 + (367-a)%10/2+1 ) * ((367-a)/10+1) / 2;
    printf( "%u\n", count ); // 23389

    return 0;
}

2016-07-04 13:59



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




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

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