import java.util.EnumMap;
import java.util.Map;
public class Main {
private enum Coin {
QUARTER(25, "quarter"), DIME(10, "dime"), NICKEL(5, "nickel"), PENNY(1, "penny", "pennies");
private final int pennyValue;
private final String singular
; private final String multiple
;
this.pennyValue = pennyValue;
this.singular = singular;
this.multiple = multiple;
}
Coin
(int pennyValue,
String singular
) { this.pennyValue = pennyValue;
this.singular = singular;
this.multiple = singular + 's';
}
public QuotientAndRemainder divide(int pennies) {
return QuotientAndRemainder.quotient(pennies / pennyValue).withRemainder(pennies % pennyValue);
}
public String format
(int amount
) { return Integer.
toString(amount
) + ' ' + (amount
== 1 ? singular
: multiple
); }
}
private static class QuotientAndRemainder {
private final int quotient;
private final int remainder;
private QuotientAndRemainder(int quotient, int remainder) {
this.quotient = quotient;
this.remainder = remainder;
}
public static QuotientAndRemainder quotient(int quotient) {
return new QuotientAndRemainder(quotient, 0);
}
public QuotientAndRemainder withRemainder(int remainder) {
return new QuotientAndRemainder(quotient, remainder);
}
private int quotient() {
return quotient;
}
private int remainder() {
return remainder;
}
}
public static String convert
(int amount
) { return print(minimalChange(amount));
}
private static String print
(Map
<Coin, Integer
> amounts
) { StringBuilder builder = new StringBuilder();
for (Coin coin : amounts.keySet()) {
builder.append(coin.format(amounts.get(coin))).append('\n');
}
return builder.toString();
}
private static Map<Coin, Integer> minimalChange(int amount) {
int penniesLeft = amount;
Map<Coin, Integer> amounts = new EnumMap<Coin, Integer>(Coin.class);
for (Coin coin : Coin.values()) {
QuotientAndRemainder quotientAndRemainder = coin.divide(penniesLeft);
amounts.put(coin, quotientAndRemainder.quotient());
penniesLeft = quotientAndRemainder.remainder();
}
return amounts;
}
public static void main
(String[] args
) { String conversionString
= convert
(89);
new StringBuilder().append("Converted amount equates to: ")
.append("\n"));
System.
out.
println(conversionString
); }
}