/*
一个顾客买了价值为x元的商品:并将y元的钱教给售货员。售货员希望用张数
最少的钱币找给顾客。找的钱最多需要以下6种币值:50,20,10,5,2,1
这道题目的关键在于:
设定一个数组b[6] = {50,20,10,5,2,1}
采用累除法,依次从数组b的高位到低位进行累加,如果当前钱币的值除了之后
有剩余,那么累加找钱币的个数,更新剩余需要找的钱,用下一个币值重复上述过程
输入:
1(买东西的钱) 100(付给的钱)
输出:
6 【1(50) + 2(20) + + 1(5)+ 2(2) = 6】
*/
#include <stdio.h>
int leastNumOfBackMoney(int iNeedBackMoney,int* pMoneyTypeArr,int iMoneyTypeNum)
{
if(iNeedBackMoney <= 0)
{
return -1;
}
int iRet = 0;
for(int i = 0 ; i < iMoneyTypeNum; i++)
{
int iNum = iNeedBackMoney / pMoneyTypeArr[i];
iNeedBackMoney -= iNum * pMoneyTypeArr[i];
iRet += iNum;
if(iNeedBackMoney == 0)
{
break;
}
}
return iRet;
}
void process()
{
int iCost,iPay;
int iMoneyTypeNum = 6;
int iMoneyTypeArr[6] = {50,20,10,5,2,1};
while(EOF != scanf("%d %d",&iCost,&iPay))
{
if(iCost > iPay)
{
break;
}
int iNeedBack = iPay - iCost;
printf("%d\n",leastNumOfBackMoney(iNeedBack,iMoneyTypeArr,iMoneyTypeNum));
}
}
int main(int argc,char* argv[])
{
process();
getchar();
return 0;
}
算法设计与分析:第二章 递归 2.2买商品
最新推荐文章于 2023-10-16 17:17:45 发布