http://oshiete1.goo.ne.jp/qa5816775.html
<br>
実際に組んで見ましょうか。 <br>
実行結果は以下の通り、時間は1秒もかかりませんでした。
<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>
実際に組んで見ましょうか。 <br>
実行結果は以下の通り、時間は1秒もかかりませんでした。
金額を1つ指定してください
1234567
結果 1234567円の場合 32円硬貨 38576枚、25円硬貨 5枚、10円硬貨 1枚、1円硬貨 0枚、総計 38582枚
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>