加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

投币自动售票程序

发布时间:2020-12-16 00:37:11 所属栏目:大数据 来源:网络整理
导读:题目:投币自动售票程序 要求: 找钱原则“有大面值的货币就不找小面试的货币” 例如:当售票机中有10c=1,20c=3,50c=1。需要找60c,这个时候就要找1个50c的和1个10c的硬币,而不是3个20c的硬币。 再比如,当售票机中有5c=1,50c=1,100c($1) = 1,需要找160c,

题目:投币自动售票程序
要求: 找钱原则“有大面值的货币就不找小面试的货币”

例如:当售票机中有10c=>1,20c=>3,50c=>1。需要找60c,这个时候就要找1个50c的和1个10c的硬币,而不是3个20c的硬币。
再比如,当售票机中有5c=>1,50c=>1,100c($1) => 1,需要找160c,这个时候也需要能正确找钱。
说的简单点,就是有个函数,你提供要找的钱当参数,返回值就是找出来的钱(例如:一个数组)。

此题是澳大利亚研究生课程中.NET Programming课的结课作业
解题原理:
使用了递归
1.若是要找160的话
2.有100的话,先找100
3.这时需要找的就剩下60了,这时调用递归
4.递归第一次先找回50,剩下10,再找回5,发现最后还剩下5,找钱失败,这时回滚。
5.递归第二次先找回20,剩下40,再找回20,剩下20,再找回20,剩下0,返回成功
6.输出

?

 
 
  1. #例如:当售票机中有10c=>1,?20c=>3,?50c=>1。需要找60c,这个时候就要找1个50c的和1个10c的硬币,而不是3个20c的硬币。 ?
  2. ?
  3. #再比如,当售票机中有5c=>1,?50c=>1,?100c($1)?=>?1,需要找160c,这个时候也需要能正确找钱。 ?
  4. ?
  5. #说的简单点,就是有个函数,你提供要找的钱当参数,返回值就是找出来的钱(例如:一个数组)。 ?
  6. ?
  7. #所有的币值列表 ?
  8. ?
  9. @coins=(?100,50,20,10,5,2,1); ?
  10. #每个币值对应的个数 ?
  11. ?
  12. @coinnums=(?1,?1,?2,?0,3,0); ?
  13. ?
  14. #每个币值对应的个数 ?
  15. ?
  16. @paybackCoins=(); ?
  17. $paybackTotal=160; ?
  18. if(payback($paybackTotal)==0){ ?
  19. ????print?join(",",@paybackCoins)."n"; ?
  20. }else{ ?
  21. ????print?"payback?$paybackTotal?failn"; ?
  22. } ?
  23. ?
  24. @coins=(?100,1); ?
  25. @coinnums=(?0,?3,0); ?
  26. @paybackCoins=(); ?
  27. $paybackTotal=60; ?
  28. if(payback($paybackTotal)==0){ ?
  29. ????print?join(",@paybackCoins)."n"; ?
  30. }else{ ?
  31. ????print?"payback?$paybackTotal?failn"; ?
  32. } ?
  33. ?
  34. @paybackCoins=(); ?
  35. $paybackTotal=55; ?
  36. if(payback($paybackTotal)==0){ ?
  37. ????print?join(",@paybackCoins)."n"; ?
  38. }else{ ?
  39. ????print?"payback?$paybackTotal?failn"; ?
  40. } ?
  41. ?
  42. sub?payback{ ?
  43. ????my?$payback=shift; ?
  44. ????$coinslen=scalar(@coins); ?
  45. ????my?$i=0; ?
  46. ????for($i=0;$i<$coinslen;$i++){ ?
  47. ????????????if($coinnums[$i]>0){ ?
  48. ????????????????my?$coin=$coins[$i]; ?
  49. ???????????????? ?
  50. #????????????????每次都从最大币值开始循环 ?
  51. ?
  52. ????????????????if($payback?>=?$coin){ ?
  53. ????????????????????push(@paybackCoins,$coin); ?
  54. ????????????????????$payback-=$coin; ?
  55. ????????????????????$coinnums[$i]--; ?
  56. ????????????????????if($payback<=0){ ?
  57. #????????????????????????剩下0时返回 ?
  58. ?
  59. ????????????????????????return?0; ?
  60. ????????????????????} ?
  61. #????????????????????继续找剩下的钱 ?
  62. ?
  63. ????????????????????if(payback($payback)!=0){ ?
  64. #????????????????????????剩下的钱找不完时,回滚 ?
  65. ?
  66. ????????????????????????$rollbackCoin=pop(@paybackCoins);???? ?
  67. ????????????????????????$coinnums[$i]++; ?
  68. ????????????????????????$payback+=$rollbackCoin; ?
  69. ????????????????????}else{ ?
  70. #????????????????????????剩下的钱找完时,返回 ?
  71. ?
  72. ????????????????????????return?0;???? ?
  73. ????????????????????} ?
  74. ????????????????} ?
  75. ????????????} ?
  76. ????????} ?
  77. ????return?1; ?
  78. }?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读