アプリ版:「スタンプのみでお礼する」機能のリリースについて

プログラミングの問題です
「金額を入力させ、500円玉、100円玉、50円玉、10円玉、1円玉の組み合わせで、枚数が最小になる組み合わせを表示するプログラムを作れ」
を主にprintfとscanfの2つを使って作るんですけど、さっぱり分かりません。
誰か教えてください‼︎

A 回答 (8件)

外していたらごめんなさいですが・・・


プログラミングではありません。
   
要するにアルゴリズムを考えて、それからプログラミングという手順になるでしょう。
アルゴリズムを考え方です。繰り返しますが駄目だったらゴメンナサイ。
  
この手の計算は金種計算と呼ばれるもので、Excelでの計算はネット上に多くあります。
http://www.excel.studio-kazu.jp/lib/e1sw/e1sw.html
  
これの考え方を参考にして、プログラミングは出来ませんか?
    • good
    • 1

>誰か教えてください‼︎


回答になっていなくてすいません。

No6さんの指摘通り、「枚数が最小になる」というのが難しそうですね
今回の組み合わせにはありませんが、もし、50円、40円、10円の硬化の場合
80円の金額は 50+10+10+10 の4枚でなく、40+40の2枚が正解になるのですよね。

今までの回答にあったプログラムでは、満点の評価が得られない気がします。
    • good
    • 0

大きい金額の硬貨で割れば、その硬貨が何枚あるか分かります。


更に金額の余りを使って、金額を満たす硬貨で割れば、を繰り返せばできます。

余りの金額を満たさない(残りの金額は80円なのに100円硬貨の枚数を求める)や、
余りの金額が0円である場合は硬貨枚数を求める必要はありませんね。
    • good
    • 2

C 言語に <iostream> なんてないんだけどね>#4.



全部の回答に突っ込んでおくと, 「それで本当に『最小』になる」ことをどこかに証明しておかないとまずいかも. 世の中には
大きい方から順に決めていくと「最小枚数にならない」
こともあったりしますし.
    • good
    • 2

No.4です。


5円玉は入ってないんですね。

【誤】
static int kouka[] = { 500,100,50,10,5,1,ENDOFDATA };
【正】
static int kouka[] = { 500,100,50,10,1,ENDOFDATA };

硬貨の定義から5を抜きます。
    • good
    • 0

No.2さんのアイデアで正解じゃないかと思います。


今回はループを使ってみました。
ループを使わないで書き下しても大丈夫でしょう。

printf,scnafという事なのでC言語スタイルで書いています。

VC2019で動作確認済みです。
VCで作成しましたが、scanfは脆弱性があるということで、scanf_sを使用しています。
動作は同じだと思います。読みかえてください。

”//"でコメント入れましたので、ご参考にしてください。
コメント行でエラーになる場合は /* */で文章を囲うように変更してください。
"//"はC++で登場したコメント行の記述方法なので、
古いCコンパイラではコメント行として扱われない場合があります。
-------------------------------------------------------------------------------
#include <iostream>

#define ENDOFDATA 0
int main()
{
// 硬貨の定義 最後のデータはENDOFDATAとする
// 硬貨の種類の個数をあらかじめ定義して、配列の個数としても良い
static int kouka[] = { 500,100,50,10,5,1,ENDOFDATA };
// 変数の定義
int money = 0; // 入力する金額が入る変数
int maisuu = 0; // 調べたい硬貨の枚数
int i = 0; // ループに使うインデックス

// 初期メッセージ
printf("金額を入力してリターンキーを押します\n");
// 金額の入力
scanf_s("%d", &money);

// 入力金額のプリント表示
printf("入力金額:%d円\n", money);

//硬貨の枚数を調べる
for (i = 0; money!=0 && kouka[i]!= ENDOFDATA; i++)
{
maisuu = money / kouka[i];
money = money % kouka[i];
printf("%d円:%d枚\n", kouka[i], maisuu);
}
}
    • good
    • 0

大きい数から引いていってそれをカウント、マイナスになったら値を引く前に戻して次の数とか?

    • good
    • 0

枚数が最小にするためには、貨幣は高額の方が少なくなりますよね。


ですから、ポイントとしては、額面が高い貨幣からわっていけばよいことですよ。

最初に500で割って、枚数をだす。
次に余りを100で割って枚数をだす。
次に余りを50で割って枚数をだす
・・・・・
ということを順番にすれば良いことでしょう?

あとは言語の仕様にあわせてプログラウをかけばよいことだと思いますが。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています