前几天CSDN论坛的首页,看到一则帖子,题目是:“一道经典的C++题,关于分钱的问题,适合新手阅读(黑客X档案论坛题目) ”,链接如下:http://blog.csdn.net/gisfarmer/archive/2009/02/08/3869236.aspx

题如下:
把一张面值为一元的纸币,换成一分,二分,五分的硬币,共有多少种换法?编程输出每一种不同的算法。

这道题很简单,是最简单的C++题,用C也可以做。

看了原贴http://bbs.hackerxfiles.net/thread-98055-15-1.html和http://blog.csdn.net/gisfarmer/archive/2009/02/08/3869236.aspx

里面有很多答案,说实在的,有点看不下去了,因为总感受写的代码有点别扭,做的一些循环都像是写死了的。。

比如:

  1. int x=0,y=0,z=0,n=0;
  2. int count=0;
  3. for(z=1;z<20;z++)
  4. {
  5. for(y=1;y<=(100-z*5)/2;y++)

我不知道z<20为什么要这么写,为什么是20呢?

还有就是如果如果再加一个一毛,或者是五毛,求共有多少种换法,这又怎么写呢?

又或者是分的不是一块钱,分的是五块钱,求共有多少种换法,又怎么写呢?

。。。哎,我也是写程序的,很怕业务的改变,所以在想,能不能写一个通用点的方法,于是自己写了一个如下,还请路过的指教一下(本人是菜鸟).

写了两个方法,一个需要输出明细,一个不需要输出明细,大家可以试着玩一下。。

c#:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleStudy
{
    class SumNumberDemo
    {
        static void Main() {

Console.WriteLine("SumNumberDemo");
            List<int> intList = new List<int>();
            string reString =string.Empty;
            int count = 0;
            intList.Add(1);
            intList.Add(2);
            intList.Add(5);
            //intList.Add(7);
            //intList.Add(9);
            //不需要输出明细
            SplitMoney(100, 0, intList, 0, ref count);
            //输出明细
            //SplitMoney(10, 0, intList, 0, reString, ref count);
            Console.WriteLine(string.Format("总共有{0}种分法",count));
        }

/// <summary>
        /// 分钱方法
        /// </summary>
        /// <param name="pmMoney">被分的钱</param>
        /// <param name="pmMoneyNow">当前分法的钱的和</param>
        /// <param name="pmMoneyList">分钱列表</param>
        /// <param name="pmMoneyIndex">当前分钱索引</param>
        /// <param name="pmString">当前分法明细</param>
        /// <param name="pmSplitCount">分钱方法总数统计</param>
        static void SplitMoney(int pmMoney, int pmMoneyNow, List<int> pmMoneyList, int pmMoneyIndex, string pmString, ref int pmSplitCount)
        {
            int snCount=pmMoneyList.Count;

if (pmMoneyIndex < pmMoneyList.Count)
            {
                for (int i = 0; i * pmMoneyList[pmMoneyIndex] <= pmMoney; i++)
                {
                    //当前和统计
                    int snSumNow = i * pmMoneyList[pmMoneyIndex]+pmMoneyNow;

//--begin----这个字符串主要是为了输出的,如果不要求输出可以注释掉----------------
                    string snString = string.Empty;
                    if (string.IsNullOrEmpty(pmString))
                    {
                        snString = string.Format("{0}*{1}",i, pmMoneyList[pmMoneyIndex]);
                    }
                    else {
                        snString = string.Format("{0}+{1}*{2}", pmString, i, pmMoneyList[pmMoneyIndex]);
                    }
                    //---end------------------

if (snSumNow == pmMoney)
                    {
                        //------begin-------------
                        for (int j = pmMoneyIndex+1; j < snCount;j++ )
                        {
                            snString += string.Format("+0*{0}", pmMoneyList[j]);
                        }
                        //-------end-------------
                        pmSplitCount++;

Console.WriteLine(string.Format("---{0}={1}---",snString,pmMoney));
                    }
                    else
                    {
                        SplitMoney(pmMoney, snSumNow, pmMoneyList, pmMoneyIndex + 1, snString, ref pmSplitCount);
                    }

}
            }

}

/// <summary>
        /// 分钱方法
        /// </summary>
        /// <param name="pmMoney">被分的钱</param>
        /// <param name="pmNoneyNow">当前分法的钱的和</param>
        /// <param name="pmMoneyList">分钱列表</param>
        /// <param name="pmMoneyIndex">当前分钱索引</param>
        /// <param name="pmSplitCount">分钱方法总数统计</param>
        static void SplitMoney(int pmMoney, int pmNoneyNow, List<int> pmMoneyList, int pmMoneyIndex, ref int pmSplitCount)
        {
            int snCount = pmMoneyList.Count;
           
            if (pmMoneyIndex < pmMoneyList.Count)
            {
                for (int i = 0; i * pmMoneyList[pmMoneyIndex] <= pmMoney; i++)
                {
                    //当前和统计
                    int snSumNow = i * pmMoneyList[pmMoneyIndex] + pmNoneyNow;
                    if (snSumNow == pmMoney)
                    {
                        pmSplitCount++;
                    }
                    else
                    {
                        SplitMoney(pmMoney, snSumNow, pmMoneyList, pmMoneyIndex + 1, ref pmSplitCount);
                    }
                }
            }

}
    }
}

一道经典的C++题,关于分钱的问题,适合新手阅读(黑客X档案论坛题目) [c#]相关推荐

  1. 一道经典面试逻辑题的python解法

    前言: 好早之前看到的一个逻辑题:有两个2到99之间的整数,a知道这两个数的和,b知道这两个数的积. 第一句:a对b说:我不知道这两个数是多少,但我确信你也不知道. 第二句:b说:我知道了. 第三句: ...

  2. 【强烈推荐收藏】坚持3个月爆肝华为机试108题C++全解(适合新手入门,就业必刷套题)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 前言 金九银十,金三银四.当前正处于校招.社招的火热期,之前就想为正在筹备就业的同学们准备刷题宝 ...

  3. 最适合新手的python刷题网站_有没有适合新手练习Python的网站(做题类)?

    直接在知乎看我整理的练习题就可以了, 给你分享一下我自己亲身经历过的python考试题(下面还有练习题大全哦~~~) 记得给小达点个关注~ 你可以参考下面的题进行练习,考试题换汤不换药,希望对你有帮助 ...

  4. 5个适合新手练习的Python刷题网站

    公众号后台回复"图书",了解更多号主新书内容 作者:朱卫军 来源:Python大数据分析 知乎上有人问,有没有适合新手练习 Python 的做题类网站? 根据我刷题找资料的经验,推 ...

  5. 【菜鸟教程】Python 100例编程题--适合新手(1)

    菜鸟教程100例题的解答,python 3.7及jupyter notebook实现,可能代码并不是最简洁的,但一定通俗易懂,适合新手阅读. 题目及代码如下: 1.题目:有四个数字:1.2.3.4,能 ...

  6. 一道经典极限题的分析与求解

    一道经典极限题的分析与求解 题目 lim⁡x→∞ex(1+1x)x2\lim_{x\to \infty}\frac{\mathrm{e}^x}{(1+\frac1x)^{x^2}} x→∞lim​(1 ...

  7. LeetCode刷题——链表OJ(历时三天,万字博客,十一道经典题,带你手撕链表)

    知之愈明,则行之愈笃:行之愈笃,则知之益明. 学完链表,我们不得刷刷题增进对链表的认识?今天博主选取十一道经典链表题,从刷题者的角度剖析重点和易错点,讲解最简单的方法,文章内附题目和题目链接,重点内容 ...

  8. 微软的一道经典逻辑推理题:小明和小强都是张老师的学生,张老师的生日是M月N日

    微软的一道经典逻辑推理题:小明和小强都是张老师的学生,张老师的生日是M月N日 分类: 天下杂侃 2008-08-07 23:37 17495人阅读 评论(21) 收藏 举报 题目是这样的: 小明和小强 ...

  9. 微软的一道经典逻辑推理题 小明和小强都是张老师的学生,张老师的生日是M月N日

    微软的一道经典逻辑推理题:小明和小强都是张老师的学生,张老师的生日是M月N日 分类: 天下杂侃 2008-08-07 23:37 17495人阅读 评论(21)收藏 举报 题目是这样的: 小明和小强都 ...

  10. (组合数学习题)递推关系一道经典题分析与解答

    文章目录 题目 分析与解答 求解 程序实现(C++) 题目 来看下面一道题,主要用到的是组合数学中的递推关系部分的内容. 某长度为nnn的二进制序列,要求其中至少有连续的333个000出现,问:能产生 ...

最新文章

  1. HYSBZ - 1798 Seq 维护序列seq 线段树lazy标记
  2. 动手写一个简单版的谷歌TPU
  3. idea设置打开文件窗口个数
  4. 开源社区_建立一个开源社区
  5. WebAssembly 将成为互联网的终结?
  6. CentOS_6.x安装VNC_Server
  7. mysql not in 或 in 优化
  8. android compare方法,如何的CompareTo或在Android Studio中
  9. 一个屌丝程序猿的人生(八十七)
  10. 大地坐标系与经纬度转换(一):大地坐标系简介
  11. 马斯克 的 2500 吨 推力 的 大火箭 没什么 了不起
  12. 七成知识分子走在过劳死边缘
  13. JavaWeb-10课Filter过滤器
  14. advisor 2002在matlab2014a上的安装
  15. 微信公众平台开发-PHP版
  16. win10共享计算机win7,Win7系统和win10系统设置共享打印机的方法
  17. BZOJ:3441 乌鸦喝水
  18. html中repeat的作用,repeat-y
  19. C语言,从联合看字节序
  20. ICML 2020 | GCNII:简单和深度图卷积网络

热门文章

  1. 线性调频信号的脉冲压缩
  2. 穿越机F4飞控F405代码pcb文件,原理图
  3. java坦克大战墙_Java-坦克大战
  4. 20201125 plecs更新
  5. 开户银行的现代化支付行号CNAPS查询
  6. 应对雾霾,哪款口罩适合你?
  7. 根据error_log发现图片木马,被上传到图片文件夹
  8. C4D OC渲染器混合材质置换问题求助
  9. iOS AVPlayer播放模式的实现(随机播放 列表循环 单曲循环)
  10. MATLAB向量运算