fork download
  1. import java.util.EnumMap;
  2. import java.util.Map;
  3.  
  4. public class Main {
  5.  
  6. private enum Coin {
  7. QUARTER(25, "quarter"), DIME(10, "dime"), NICKEL(5, "nickel"), PENNY(1, "penny", "pennies");
  8.  
  9. private final int pennyValue;
  10. private final String singular;
  11. private final String multiple;
  12.  
  13. Coin(int pennyValue, String singular, String multiple) {
  14. this.pennyValue = pennyValue;
  15. this.singular = singular;
  16. this.multiple = multiple;
  17. }
  18.  
  19. Coin(int pennyValue, String singular) {
  20. this.pennyValue = pennyValue;
  21. this.singular = singular;
  22. this.multiple = singular + 's';
  23. }
  24.  
  25. public QuotientAndRemainder divide(int pennies) {
  26. return QuotientAndRemainder.quotient(pennies / pennyValue).withRemainder(pennies % pennyValue);
  27. }
  28.  
  29. public String format (int amount) {
  30. return Integer.toString(amount) + ' ' + (amount == 1 ? singular : multiple);
  31. }
  32. }
  33.  
  34. private static class QuotientAndRemainder {
  35. private final int quotient;
  36. private final int remainder;
  37.  
  38. private QuotientAndRemainder(int quotient, int remainder) {
  39. this.quotient = quotient;
  40. this.remainder = remainder;
  41. }
  42.  
  43. public static QuotientAndRemainder quotient(int quotient) {
  44. return new QuotientAndRemainder(quotient, 0);
  45. }
  46.  
  47. public QuotientAndRemainder withRemainder(int remainder) {
  48. return new QuotientAndRemainder(quotient, remainder);
  49. }
  50.  
  51. private int quotient() {
  52. return quotient;
  53. }
  54.  
  55. private int remainder() {
  56. return remainder;
  57. }
  58. }
  59.  
  60. public static String convert(int amount) {
  61. return print(minimalChange(amount));
  62. }
  63.  
  64. private static String print(Map<Coin, Integer> amounts) {
  65. StringBuilder builder = new StringBuilder();
  66. for (Coin coin : amounts.keySet()) {
  67. builder.append(coin.format(amounts.get(coin))).append('\n');
  68. }
  69. return builder.toString();
  70. }
  71.  
  72. private static Map<Coin, Integer> minimalChange(int amount) {
  73. int penniesLeft = amount;
  74. Map<Coin, Integer> amounts = new EnumMap<Coin, Integer>(Coin.class);
  75. for (Coin coin : Coin.values()) {
  76. QuotientAndRemainder quotientAndRemainder = coin.divide(penniesLeft);
  77. amounts.put(coin, quotientAndRemainder.quotient());
  78. penniesLeft = quotientAndRemainder.remainder();
  79. }
  80. return amounts;
  81. }
  82.  
  83. public static void main(String[] args) {
  84. String conversionString = convert(89);
  85.  
  86. System.out.println(
  87. new StringBuilder().append("Converted amount equates to: ")
  88. .append("\n"));
  89.  
  90. System.out.println(conversionString);
  91. }
  92. }
  93.  
Success #stdin #stdout 0.08s 380224KB
stdin
Standard input is empty
stdout
Converted amount equates to: 

3 quarters
1 dime
0 nickels
4 pennies