作者qoo200033 (好時光)
看板C_and_CPP
標題[討論] 換零錢程式
時間Wed Apr 6 13:59:32 2011
問題:寫出一模擬換零錢程式
(1)只接受紙鈔(100,200,500,1000元)
(2)可選擇零錢面額(1元,5元,10元,50元)及個數
(3)剩下金額以最少的零錢數找出(假設要以100元換10個一元,
結果會出來10個一元以及9個十元)
程式:
#include<stdio.h>
#include<stdlib.h>
void cash(int);
void charge(int ,int,int,int);
int main(void){
int money;
printf("input money style(1)100 (2)200 (3)500 (4)1000\n");//輸入金額
scanf("%d",&money);
cash(money);
return 0;
}
void cash(int money){
int x,y,change;
if (money<1 || money>4)//輸入金額模式
printf("only accept banknote\n");
else{
printf("please chose change money\n");//換錢模式
printf("(1)一元(2)五元(3)十元(4)五十元\n");
scanf("%d",&x);
if (x<1 || x>4){
printf("請輸入正確幣值\n");//超過金額重新輸入
cash(money);
}else {
printf("what several do u want\n");
scanf("%d",&y);//y為換幾枚
switch(x){
case 1:
change=1*y;
break;
case 2:
change=5*y;
break;
case 3:
change=10*y;
break;
case 4:
change=50*y;
break;
}
printf("換了%d元%d枚",change/y,y);
charge(x,y,money,change);
}
}
}
void charge(int x,int y,int money,int change){
int z,one,five,ten;
switch (money)
{
case 1:
money=100;
break;
case 2:
money=200;
break;
case 3:
money=500;
break;
case 4:
money=1000;
break;
}
z=money-change;
ten=(z-z%10);
five=(z-ten)-((z-ten)%5);
one=(z-ten)%5;
printf("共找你%d元\n",z);
printf("十元%d枚,五元%d枚,一元%d枚\n",ten/10,five/5,one);
}
上面程式為我自己寫的
(1)不知道是否有更精簡或更高級的寫法
(2)不知程式是否有bug
請指教 謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 120.101.8.91
推 jason12308:讓我想到VERILOG的自動販賣機...... 04/06 14:06
→ tkcn:先把排版排好吧 04/06 14:09
推 otira:100換10個1 應該是 10個1 4個10 1個50 XD 04/06 14:23
推 attomahawk:關於使用 「最少零錢數目找錢」 的部分: 04/07 02:37
→ attomahawk:1. 可以使用 Greedy Method 找 近似解。 04/07 02:37
→ attomahawk:2. 可以使用 Dynamic Programming 找 最佳解(假如存在) 04/07 02:38
→ attomahawk:目前瀏覽過您的程式碼,其精神類似Greedy Method。 04/07 02:39
→ attomahawk:可嘗試用 Dynamic Programming 改寫看看。 04/07 02:39
→ attomahawk: 04/07 02:40
→ attomahawk: 04/07 02:44
→ attomahawk:搜尋關鍵字: Money-Changing Problem 04/07 02:45
推 attomahawk: 04/07 03:09
→ attomahawk:小弟對於 Money-Changing Problem 的練習: 04/07 03:09
→ attomahawk:還請大家多多給予指導,小弟在此先向大家說聲謝謝! : ) 04/07 03:10
推 DJWS:樓上 我記得我沒有那樣寫啊 04/07 09:47
→ DJWS:這種幣值組合 用greedy method 就可以了啦 04/07 09:48