2016-11-29 2 views
0

Нужна помощь в том, как распечатать отдельные монеты, такие как quarters = 3, pennies = 1, вместо того, чтобы просто дать мне 4 монеты за 76 центов. Я попробовал установить 4 счетчика, но это только что напечатало имена и ответы на монеты.Изменение рекурсии монеты

import java.util.Scanner; 
public class Money 
{ 
    public static void main(String args[]) 
    { 
     int[] coins = { 1, 5, 10, 25}; 
     Scanner scan = new Scanner(System.in); 
     System.out.print("Enter Change (In Cents): "); 
     int sum = scan.nextInt(); 
     int counter1 = 0; 
     int counter2 = 0; 
     int counter3 = 0; 
     int counter4 = 0; 
     String quarter = ""; 
     Money minCoin = new Money(); 
     System.out.println(minCoin.findMinCoins(coins, sum, counter1, counter2, counter3, counter4)); 
     System.out.println(counter4); 
    } 

    private int findMinCoins(int[] coins, int sum, int counter1, int counter2, int counter3, int counter4) 
    { 
     if (sum <= 0 || coins.length == 0) 
     { 
      return 0; 
     } 

     for (int i = coins.length - 1; i >= 0; i--) 
     { 
      if(coins[i] == 1 && coins[i] != 5) 
      { 
       counter1++; 
      } 

      if(coins[i] == 5) 
      { 
       counter2++; 
      } 

      if(coins[i] == 10) 
      { 
       counter3++; 
      } 

      if(coins[i] == 25) 
      { 
       counter4++; 
      } 

      if (coins[i] <= sum) 
      { 
       System.out.println("Pennies: " + counter1); 
       System.out.println("Nickels: " + counter2); 
       System.out.println("Dimes: " + counter3); 
       System.out.println("Quarters: " + counter4); 
       return 1 + findMinCoins(coins, sum - coins[i], counter1, counter2, counter3, counter4); 

      } 
     } 
     return 0; 
    } 

} 
+0

В вашем заявлении return у вас есть 1 + findMinCoins ... но это на самом деле не дает информации о том, какую монету представляет 1. Вместо этого попробуйте добавить 1 к переменным в операторе return, например: findMinCoins (монеты, суммы - монеты [i], counter1 + 1, ...), чтобы показать, что вам нужен еще один пенни. –

ответ

0

Попробуйте это:

import java.util.Scanner; 
public class Money 
{ 
public static void main(String[] args) { 

     int[] coins = {1, 5, 10, 25}; 
     Scanner scan = new Scanner(System.in); 
     System.out.print("Enter Change (In Cents): "); 
     int sum = scan.nextInt(); 
     int counter1 = 0; 
     int counter2 = 0; 
     int counter3 = 0; 
     int counter4 = 0; 
     String quarter = ""; 
     Money minCoin = new Money(); 
     System.out.println(minCoin.findMinCoins(coins, sum, counter1, counter2, counter3, counter4)); 
     System.out.println(counter4); 

    } 

    private int findMinCoins(int[] coins, int sum, int counter1, int counter2, int counter3, int counter4) { 
     if (sum <= 0 || coins.length == 0) { 
      return 0; 
     } 

     for (int i = coins.length - 1; i >= 0; i--) { 

      if (coins[i] == 25 && sum >= coins[i]) { 
       counter4++; 

      } 

      else if (coins[i] == 10 && sum >= coins[i]) { 
       counter3++; 
      } 

      else if (coins[i] == 5 && sum >= coins[i]) { 
       counter2++; 
      } 

      else if (coins[i] == 1 && sum >= coins[i]) { 
       counter1++; 
      } 

      if (coins[i] <= sum) { 
       System.out.println("Pennies: " + counter1); 
       System.out.println("Nickels: " + counter2); 
       System.out.println("Dimes: " + counter3); 
       System.out.println("Quarters: " + counter4); 
       return 1 + findMinCoins(coins, sum - coins[i], counter1, counter2, counter3, counter4); 

      } 
     } 
     return 0; 
    } 
} 
+0

. Пожалуйста, подумайте над добавлением дополнительной информации в ваш ответ объясняет ваши изменения. :) – Gulllie

+0

Здесь я добавил сравнение между стоимостью монеты и суммы. – RJMIMI38

0

Я подозреваю, что вы не поняли, как аргументы, передаваемые методам Java работать. Вы передаете значения «counter» и затем повторяете их внутри метода и ожидаете, что их значения в вызывающем методе будут изменены. Это не то, как работает Java. См. here для более подробной информации.

Если вы не ожидаете вернуть значения из метода (потому что вы печатаете их внутри), то нет смысла делать их аргументами. Лучше всего сделать его локальной переменной внутри области действия метода.

Возможно, вам будет немного легче, если вы закажете от самого большого до наименьшего и вернете массив из вашего калькулятора изменений. Тогда вам не понадобятся отдельные переменные для ваших счетчиков.

Что-то вроде следующего:

int[] coins = {25, 10, 5, 1}; 
String[] names = {"Quarters", "Dimes", "Nickles", "Pennies"}; 
int[] change = getChange(coins, total); 
for (int i = 0; i < change.length; i++) { 
    System.out.println(names[i] + ":" + change[i]); 
} 

private int[] getChange(int[] coins, int total) { 
    int[] result = new int[coins.length]; 
    for (int i = 0; i < coins.length; i++) { 
     result[i] = total/coins[i]; 
     total -= result[i] * coins[i]; 
    } 
    return result; 
} 

Обратите внимание, что это имеет преимущество целочисленного деления в Java округление вниз. Поэтому, если вы начнете с 76 центов, он вернется на 3 квартала (76/25 -> 3). Отметим также, что второй оператор в цикле может быть total %= coins[i], который будет иметь тот же эффект, но может быть более понятным. В любом случае код говорит «удалить из общего значения текущего номинала».

Смежные вопросы