教えて!Gooについて回答とか疑問とか

教えて!Gooについて回答とか疑問とか

QA5816775 硬貨の最小枚数の問題

2010-04-13 09:21:37 | 日記
http://oshiete1.goo.ne.jp/qa5816775.html <br>
実際に組んで見ましょうか。 <br>
実行結果は以下の通り、時間は1秒もかかりませんでした。

金額を1つ指定してください
1234567
結果 1234567円の場合 32円硬貨 38576枚、25円硬貨 5枚、10円硬貨 1枚、1円硬貨 0枚、総計 38582枚


<pre>
package coin;

public class Coin5816775 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        long    price_total;
        String    strKingaku    =    "1000";
        // 金額は?
        if(args.length    != 1){
            System.out.println("金額を1つ指定してください");
                java.io.BufferedReader br =
                new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
                try{
                    strKingaku = br.readLine();
                }catch(Exception ex){
                    System.out.println(ex.getStackTrace().toString());
                    return;
                }
        }else{
            strKingaku    =    args[0];
        }
        try{
            price_total    =    Long.parseLong(strKingaku);
        }catch(Exception ex){
            System.out.println(ex.getStackTrace().toString());
            return;
        }
       
        long    lp_32;        //
        long    lp_25;        //
        long    min_32;        //調べる範囲:最小:32円
        long    min_25;        //調べる範囲:最小:25円
        long    max_32;        //調べる範囲:最大:32円
        long    max_25;        //調べる範囲:最大:25円
        long    lp_10;        //
        long    lp_01;        //
        long    wk_price;    //金額作業用
        long    maisu_wk;    //枚数作業用
        long    maisu_min    =    price_total;    //最低枚数=すべて1円硬貨より大きくは無い
        String    strUchiwake    =    "";
        //現在あまっているお金
        wk_price    =    price_total;
        max_32        =    (long)(Math.floor(wk_price        /    32));
        min_32        =    Math.max(0L, max_32    -    83);
        //32円硬貨
        for(lp_32    =    min_32; lp_32    <=    max_32;    lp_32++){
            //残りいくら?           
            wk_price    =    price_total        -    lp_32    *    32;
            max_25        =    (long)(Math.floor(wk_price        /    25));
            min_25        =    Math.max(0L, max_25    - 6);
            //25円硬貨
            for(lp_25    =    min_25; lp_25    <=    max_25;    lp_25++){
                wk_price    =    price_total        -    lp_32    *    32
                                                -    lp_25    *    25;
                //10円と1円は計算で出せる
                lp_10        =    (long)(Math.floor(wk_price    /    10));
                lp_01        =    wk_price    %    10;
                //合計枚数
                maisu_wk    =    lp_32    +    lp_25    +    lp_10    +    lp_01;
                if(maisu_wk    <    maisu_min){
                    maisu_min    =    maisu_wk;
                    strUchiwake    =    "結果 "        +    price_total    +    "円の場合 "
                                +    "32円硬貨 "    +    lp_32    +"枚、"
                                +    "25円硬貨 "    +    lp_25    +"枚、"
                                +    "10円硬貨 "    +    lp_10    +"枚、"
                                +    "1円硬貨 "        +    lp_01    +"枚、"
                                +    "総計 "        +    maisu_min    +"枚";
                }

            }

        }
        System.out.println(strUchiwake);
       

    }

}

</pre>