Разница мнений по пунктам - PullRequest
       1

Разница мнений по пунктам

0 голосов
/ 06 декабря 2011

Сегодня я сделал 2 небольших сценария по физике, но теперь это начинает меня беспокоить.

Первый скрипт, точный на 100%: он используется для расчета количества купюр и монет, необходимых для желаемой суммы наличных.

Первый сценарий:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Change {

static Money[] coins;
static int[] counts;

public static void main(String[] args) throws IOException {
    coins = new Money[11];
    counts = new int[11];
    coins[0] = new Money(100);
    coins[1] = new Money(50);
    coins[2] = new Money(20);
    coins[3] = new Money(10);
    coins[4] = new Money(5);
    coins[5] = new Money(2);
    coins[6] = new Money(1);
    coins[7] = new Money(25, true);
    coins[8] = new Money(10, true);
    coins[9] = new Money(5, true);
    coins[10] = new Money(1, true);
    System.out.println("Please type the change:\n");
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String values = br.readLine();
    String[] split = values.split("\\.");
    System.out.println();
    int whole = Integer.parseInt(split[0]);
    int small = Integer.parseInt(split[1]);
    for (int i = 0; i < 7; i++) {
        while (whole >= coins[i].getValue()) {
            whole -= coins[i].getValue();
            counts[i]++;
        }
    }
    for (int i = 7; i < 11; i++) {
        while (small >= coins[i].getValue()) {
            small -= coins[i].getValue();
            counts[i]++;
        }
    }
    for (int i = 0; i < 11; i++) {
        if (counts[i] > 0)
            System.out
                    .println((coins[i].getValue() == 100 ? "" : " ")
                            + (coins[i].isDecimal() ? (" 0."
                                    + (coins[i].getValue() < 10 ? "0" : "") + coins[i]
                                        .getValue()) + ": " + counts[i]
                                    : ((coins[i].getValue() <= 5 ? " " : "") + coins[i]
                                            .getValue())
                                            + ".00: "
                                            + counts[i]));

    }
}

public static class Money {

    int value;
    boolean decimal;

    Money(int value) {
        this(value, false);
    }

    Money(int value, boolean decimal) {
        this.value = value;
        this.decimal = decimal;
    }

    boolean isDecimal() {
        return decimal;
    }

    int getValue() {
        return value;
    }
}
}

Второй сценарий:

import java.io.IOException;

public class ChangeMax {


static Money[] coins;
static int[] nums = new int[2];
static int max = -2147483648;

public static void main(String[] args) throws IOException{
    coins = new Money[11];
    coins[0] = new Money(100);
    coins[1] = new Money(50);
    coins[2] = new Money(20);
    coins[3] = new Money(10);
    coins[4] = new Money(5);
    coins[5] = new Money(2);
    coins[6] = new Money(1);
    coins[7] = new Money(25, true);
    coins[8] = new Money(10, true);
    coins[9] = new Money(5, true);
    coins[10] = new Money(1, true);
    for(int i = 0; i < 100; i++){
        int temp1 = i;
        for(int h = 1; h < 100; h++){
            int temp2 = h;
            int[] counts = new int[100];
            for (int j = 0; j < 7; j++) {
                while (temp1 >= coins[j].getValue()) {
                    temp1 -= coins[j].getValue();
                    counts[j]++;
                }
            }
            for (int k = 7; k < 11; k++) {
                while (temp2 >= coins[k].getValue()) {
                    temp2 -= coins[k].getValue();
                    counts[k]++;
                }
            }
            int sum = 0;
            for(int p : counts){
                sum += p;
            }
            if(sum > max){
                max = sum;
                nums[0] = i;
                nums[1] = h;
            }
        }
    }
    System.out.println("\nMax coins and bills required at: $"+nums[0]+"."+(nums[1] > 9 ? nums[1] : "0" + nums[1]) + ": "+max+"\n");
}

public static class Money {

    int value;
    boolean decimal;

    Money(int value) {
        this(value, false);
    }

    Money(int value, boolean decimal) {
        this.value = value;
        this.decimal = decimal;
    }

    boolean isDecimal() {
        return decimal;
    }

    int getValue() {
        return value;
    }
}

}

Второй сценарий делает то же самое, но проходит через все значения менее $ 100.

Проблема в том, что второй скрипт говорит, что максимальная сумма равна 9 и достигается при $ 0,94.

Первый скрипт, когда вы набираете что-то вроде $ 1,94, не регистрирует, что 10 являетсяновое наибольшее число вместо 9.

В чем проблема?

1 Ответ

0 голосов
/ 07 декабря 2011

Поскольку я не планирую делать домашнее задание, я не собираюсь предоставлять вам рабочий код, но оба сценария могут быть легко улучшены

1) Ваши денежные объекты знают, имеет ли значение, например, 10 представляет 10 целых долларов или 10 центов (или что бы вы ни использовали в Америке, я бы использовал евро и центы). Но все же вы используете жестко закодированный индекс вашего массива, где вы переключаетесь с долларов на центы

2) Первый скрипт потерпит неудачу, когда кто-нибудь использует в качестве входных данных округленное число без десятичной части

3) Если вы сначала преобразуете свои входные данные в центы, а также все ваши значения в массиве монет, ваш код в итоге станет намного чище и проще для понимания. Нечто в виде

int startAmount = ... ;//in cents
int remainder = startAmount;
int coinCounter = new int[coins.length];
for ( int i = 0; i < coins.length; i++ ){
  int currentCoin = coins[i];//in cents
  coinCointer[i] = 0;
  while( remainder >= currentCoin ){
    coinCointer[i] = coinCointer[i] + 1;
    remainder = remainder - currentCoin;
  }
}
//print out by looping over coinCounter, 
//and use the info contained in the Money class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...