一道经典的C++题,关于分钱的问题,适合新手阅读(黑客X档案论坛题目) [c#]
前几天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
里面有很多答案,说实在的,有点看不下去了,因为总感受写的代码有点别扭,做的一些循环都像是写死了的。。
比如:
- int x=0,y=0,z=0,n=0;
- int count=0;
- for(z=1;z<20;z++)
- {
- 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#]相关推荐
- 一道经典面试逻辑题的python解法
前言: 好早之前看到的一个逻辑题:有两个2到99之间的整数,a知道这两个数的和,b知道这两个数的积. 第一句:a对b说:我不知道这两个数是多少,但我确信你也不知道. 第二句:b说:我知道了. 第三句: ...
- 【强烈推荐收藏】坚持3个月爆肝华为机试108题C++全解(适合新手入门,就业必刷套题)
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 前言 金九银十,金三银四.当前正处于校招.社招的火热期,之前就想为正在筹备就业的同学们准备刷题宝 ...
- 最适合新手的python刷题网站_有没有适合新手练习Python的网站(做题类)?
直接在知乎看我整理的练习题就可以了, 给你分享一下我自己亲身经历过的python考试题(下面还有练习题大全哦~~~) 记得给小达点个关注~ 你可以参考下面的题进行练习,考试题换汤不换药,希望对你有帮助 ...
- 5个适合新手练习的Python刷题网站
公众号后台回复"图书",了解更多号主新书内容 作者:朱卫军 来源:Python大数据分析 知乎上有人问,有没有适合新手练习 Python 的做题类网站? 根据我刷题找资料的经验,推 ...
- 【菜鸟教程】Python 100例编程题--适合新手(1)
菜鸟教程100例题的解答,python 3.7及jupyter notebook实现,可能代码并不是最简洁的,但一定通俗易懂,适合新手阅读. 题目及代码如下: 1.题目:有四个数字:1.2.3.4,能 ...
- 一道经典极限题的分析与求解
一道经典极限题的分析与求解 题目 limx→∞ex(1+1x)x2\lim_{x\to \infty}\frac{\mathrm{e}^x}{(1+\frac1x)^{x^2}} x→∞lim(1 ...
- LeetCode刷题——链表OJ(历时三天,万字博客,十一道经典题,带你手撕链表)
知之愈明,则行之愈笃:行之愈笃,则知之益明. 学完链表,我们不得刷刷题增进对链表的认识?今天博主选取十一道经典链表题,从刷题者的角度剖析重点和易错点,讲解最简单的方法,文章内附题目和题目链接,重点内容 ...
- 微软的一道经典逻辑推理题:小明和小强都是张老师的学生,张老师的生日是M月N日
微软的一道经典逻辑推理题:小明和小强都是张老师的学生,张老师的生日是M月N日 分类: 天下杂侃 2008-08-07 23:37 17495人阅读 评论(21) 收藏 举报 题目是这样的: 小明和小强 ...
- 微软的一道经典逻辑推理题 小明和小强都是张老师的学生,张老师的生日是M月N日
微软的一道经典逻辑推理题:小明和小强都是张老师的学生,张老师的生日是M月N日 分类: 天下杂侃 2008-08-07 23:37 17495人阅读 评论(21)收藏 举报 题目是这样的: 小明和小强都 ...
- (组合数学习题)递推关系一道经典题分析与解答
文章目录 题目 分析与解答 求解 程序实现(C++) 题目 来看下面一道题,主要用到的是组合数学中的递推关系部分的内容. 某长度为nnn的二进制序列,要求其中至少有连续的333个000出现,问:能产生 ...
最新文章
- HYSBZ - 1798 Seq 维护序列seq 线段树lazy标记
- 动手写一个简单版的谷歌TPU
- idea设置打开文件窗口个数
- 开源社区_建立一个开源社区
- WebAssembly 将成为互联网的终结?
- CentOS_6.x安装VNC_Server
- mysql not in 或 in 优化
- android compare方法,如何的CompareTo或在Android Studio中
- 一个屌丝程序猿的人生(八十七)
- 大地坐标系与经纬度转换(一):大地坐标系简介
- 马斯克 的 2500 吨 推力 的 大火箭 没什么 了不起
- 七成知识分子走在过劳死边缘
- JavaWeb-10课Filter过滤器
- advisor 2002在matlab2014a上的安装
- 微信公众平台开发-PHP版
- win10共享计算机win7,Win7系统和win10系统设置共享打印机的方法
- BZOJ:3441 乌鸦喝水
- html中repeat的作用,repeat-y
- C语言,从联合看字节序
- ICML 2020 | GCNII:简单和深度图卷积网络