找零钱问题

2018-03-25  本文已影响174人  Stroman

问题

这个题目要求编写一段程序实现统一银座超市的找零方案。只需输入要补给顾客的 金额,然后通过程序就可以计算出该金额可由哪些面额的人民币组成。

思路

人民的面额总共有(第五套)100、50、20、10、5、1、0.5、0.1、0.05、0.02、0.01等11种面额,本问题依旧采用贪心算法思想来解决。即,先用大面额找零,大面额找不了,换更小的面额,直到找零完毕。

使用

package com.company;

public class Main {

    public static void main(String[] args) {
    // write your code here
        Solution.gainCharge(503.94);
    }
}

输出

100.0元 5张
1.0元 3张
0.5元 1张
0.1元 4张
0.02元 1张
0.01元 1张

Process finished with exit code 0

实现

package com.company;

import java.math.BigDecimal;

public class Solution {
    /**
     * 用贪心算法实现找零问题
     * @param money
     */
    static public void gainCharge(double money) {
        final double[] denomination = {100,50,20,10,5,1,0.5,0.1,0.05,0.02,0.01};
        if (!Solution.isValidateMoney(money)) {
            System.out.println("这不是钱币金额!");
            return;
        }
        double copiedMoney = money;
        for (int counter = 0;counter < denomination.length;counter++) {
            if (copiedMoney == 0)break;
            if (denomination[counter] > copiedMoney)continue;
            int moneyCounter = 0;
            while (copiedMoney >= denomination[counter]) {
                moneyCounter++;
                copiedMoney -= denomination[counter];
            }
            System.out.println(denomination[counter] + "元 " + moneyCounter + "张");
        }
    }

    /**
     * 检查是否是人民币的金额
     * @param money
     * @return
     */
    static private boolean isValidateMoney(double money) {
        if (money < 0)return false;
        double enlargedMoney = money * 100;
        long longMoney = (long) enlargedMoney;
        if (enlargedMoney - longMoney > 0)return false;
        return true;
    }
}

上一篇下一篇

猜你喜欢

热点阅读