ここから本文です

解決済みの質問

知恵コレに追加する

大学のプログラミング課題ができません。

ceburreさん

大学のプログラミング課題ができません。

最近大学でjavaを始めたんですが課題に行き詰まってます、課題文は以下のとおりです。

「たとえば現在の所持金額が1443円であるとき、667円の買い物をしたとする。
こういう場合にわれわれは、財布の中に小銭が増えるのを嫌って千円札1枚で支払うのではなく、わざと1222円を支払うということをする(するとおつりが555円になる)
このように、現在の所持金額と購入金額とを入力すると、最適の支払い方法を教えるプログラミングをつくれ。
簡単のため、千円札を最高額紙幣とする。 また10円玉を14枚持っているような異常な状況は考慮しない。

という課題です。正直初心者にここまでやらせるのはどうかと思ってしまうマス。
一応、この講義ではキーボードでの入力と条件の判断(ifとかelseとか)を教わりました。それを使って出来るはづだと思うんですが・・・。

気が向いたらどうか回答よろしくおねがいしますm(_ _)m

違反報告

ベストアンサーに選ばれた回答

maria_salon1984さん

なんか…久しぶりに…
難しかった orz

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

public class Sample {
public static void main(String[] args) {
Sample sample = new Sample();
sample.start();
}

private void start() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
System.out.println("所持金を入力してください");
int pocket = Integer.parseInt(br.readLine());
TreeMap<Integer, Integer> pocketMap = initArray(pocket);
System.out.println("支払い金額を入力してください");
int amount = Integer.parseInt(br.readLine());
System.out.println("計算します");
TreeMap<Integer, Integer> pay = calc(amount, pocket, pocketMap);
System.out.println("支払うのは");
int sum = 0;
for (Integer key : pay.keySet()) {
if (pay.get(key) != 0)
System.out.println(key + "円を" + pay.get(key) + "枚");
sum += key * pay.get(key);
}
System.out.println("支払い金額は" + sum + "です。");
System.out.println("おつりは" + (sum - amount) + "円です");
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

public TreeMap<Integer, Integer> calc(int amount, int pocket,
TreeMap<Integer, Integer> pocketMap) {
TreeMap<Integer, Integer> pay = new TreeMap<Integer, Integer>();
int[] coinArray = { 1000, 500, 100, 50, 10, 5, 1 };
amount = pocket - amount;
if (amount < 0) {
throw new IllegalArgumentException("Not enough");
}
for (int coin = 0; coin < coinArray.length; coin++) {
int m = (pocketMap.get(coinArray[coin]) != null) ? pocketMap
.get(coinArray[coin]) : 0;
if (m - amount / coinArray[coin] >= 0) {
pay.put(coinArray[coin], m - amount / coinArray[coin]);
}
amount %= coinArray[coin];
}
return pay;
}

private TreeMap<Integer, Integer> initArray(int pocket) {
TreeMap<Integer, Integer> purse = new TreeMap<Integer, Integer>();
int array[] = { 1000, 500, 100, 50, 10, 5, 1 };
for (int i = 0; i < array.length; i++) {
int num = pocket / array[i];
System.out.println(array[i] + "円は" + num + "枚です");
purse.put(array[i], num);
pocket -= num * array[i];
}
return purse;
}
}

  • 違反報告
  • 編集日時:2008/10/24 13:23:45
  • 回答日時:2008/10/23 23:27:19

質問した人からのコメント

  • ありがとうございます
    それにしても仕事早いですね・・・、感動しました...(≧ω≦。)
  • コメント日時:2008/10/24 15:12:01

グレード

この質問・回答は役に立ちましたか?
はい
いいえ

お役立ち度:お役立ち度 0点(5点満点中)0人中 0人が役に立つと評価しています。

ベストアンサー以外の回答

2件中12件)
並べ替え:回答日時の
新しい順
古い順

 

hypothesis_reporterさん

問題自体があまりよくないですが・・・。

10円玉を14枚持っているのは異常な状況でしょうか・・・?
まぁ、「かならず硬貨の所持枚数が最小になるように持っているとする」ということだと思いますが、そうすると5円・50円・500円は絶対に2枚以上持ってはいけないことになりますね。それはそれで「異常な状況」とも考えられますが・・・。

とまあ、問題文に対するツッコミはおいといて、
アルゴリズムを考える

所持金や支払金額は「いくらか」ではなく「各硬貨が何枚か」で考えます。
変数も「所持金」という変数を用意するのではなく、「1円」「5円」・・・「500円」「1000円」という各変数を用意します
計算するときは金額の大きい硬貨から順に足したり引いたりしていきます。
ループ文とif文で十分作れます。

考え方を少し難しく発展させると、「硬貨を基数とする数字」で考えることもできます。
1の位は1円、10の位は5円というように決めれば、
1443円は「1040403」と表すことができ、667円は「111112」と表すことができます。
桁上がりなどがややこしくなりますが
1040403
-111112
を計算すると
0121211=776円
となります。

・・・このやり方はちょっとマニアックすぎましたね。

hiyayakko562さん

> 正直初心者にここまでやらせるのはどうかと思ってしまうマス。

初心者から脱する日が来るようには見えないが。

あなたにおすすめの解決済みの質問

100円玉,50円玉,10円玉が1枚ずつあります。この3枚を使い,おつりのないように買い物するとき支払う方法は何通りあるか求めよ。 この答えって 6通りか3通り・・・ どちらですか? ◆回答まってます
500円玉貯金 最近500円玉貯金を始めたのですが、とりあえず財布の中に500円玉があれば貯金しています。ところが500円玉欲しさに千円札での支払いが増えてしまい端数の100円玉や50円玉で財布がパンパンです。。...
javaの課題がよくわかりません。教えて下さい。 javaでif文・for文・while文を使ってプログラム作りなさい という課題が出ました。 わからないなりに作ってみたのですが家のPCでは javaが動かないのでプログラムが動くかどうか確...
回答ありがとうキャンペーン 回答してポイントを当てよう!! 2000名様に500ポイントプレゼント キャンペーンの詳細を見る ※回答することで自動的に応募となります。

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。

お客様自身の責任と判断で、ご利用ください。

ただいまの回答者

15時36分現在

2311
人が回答!!

1時間以内に4,636件の回答が寄せられています。