【问题标题】:min change greedy algorithm in java最小更改java中的贪心算法
【发布时间】:2013-01-07 10:41:24
【问题描述】:

好的,所以我需要编写一个程序来问我要多少钱,然后我需要它告诉我最少的硬币数量。我可以使用的硬币有:美元、25 美分硬币、10 美分硬币、5 美分硬币和1 美分硬币。例如,当我运行程序时,它应该是这样的:

> run Coins
Enter the amount of given money:
 [1.73]
Give the seller 8 coins:
1 dollars,
2 quarters,
2 dime,
0 nickels,
3 pennies.

这是我目前所拥有的:

import java.util.Scanner;

class Coins {
  public static void main (String args[]) {
     Scanner input = new Scanner(System.in);
     double  money;
     System.out.println("Enter the amount of money ");
     money = input.nextDouble();




     while (money > 0.0 ){
       if (money >= 1) {
          System.out.println(money/1+"dollars");
          money -= 1;

     }
       else if (money>=.25) {
         System.out.println(money/.25+"quarters");
         money-=.25;

       }
       else if (money>=.10) {
         System.out.println(money/.10+"Dimes");
         money-=.10;
       }
       else if (money>=.05) {
         System.out.println(money/.05+"Nickels");
         money-=.05;
       }
       else if (money>=.01) {
         System.out.println(money/.01+"Penny");
         money-=.01;
       }
     }        
  }
}  

我需要帮助的部分是:如果我运行程序并输入金额 1.73,按照我编写代码的方式,它需要数字 1.73,除以 1,然后打印“1.73 美元”。我需要一种去掉小数部分的方法,所以不是打印“1.73 美元”,而是打印“1 美元”。但我不知道该怎么做。我尝试将其转换为 int,但它扰乱了其他语句的流程。请帮帮我。

【问题讨论】:

    标签: java double minimum greedy


    【解决方案1】:

    您应该使用floor 与转换为double 的组合,以下代码有效:

    class Coins {
        public static void main (String args[]) {
            double  money = 1.73;
    
            while (money > 0.0 ){
                if (money >= 1) {
                    System.out.println(Math.floor(money/1)+" dollars");
                    money -= Math.floor(money/1)*(double)1;
    
                }
                else if (money>=.25) {
                    System.out.println(Math.floor(money/.25)+" quarters");
                    money-=Math.floor(money/.25)*(double).25;
    
                }
                else if (money>=.10) {
                    System.out.println(Math.floor(money/.10)+" Dimes");
                    money-=Math.floor(money/.10)*(double).10;
                }
                else if (money>=.05) {
                    System.out.println(Math.floor(money/.05)+" Nickels");
                    money-=Math.floor(money/.05)*(double).05;
                }
                else if (money>=.01) {
                    System.out.println(Math.round(money/.01)+" Penny");
                    money-=Math.round(money/.01)*(double).01;
                }
            }
        }
    }
    

    您遇到的另一个错误:
    你应该减去Math.floor(money/XXX)*(double)XXX 而不是(double)XXX

    【讨论】:

    • 你为什么要使用while-loop('挂起'应用程序),if-statements(不做任何事情)和一个多余的Math.floor()调用每种硬币类型..?我猜你(也)没有尝试你的实现?
    • @Veger 关于冗余的好点子!虽然我确实测试了我的代码(使用一些测试用例)并且它确实可以正常工作:)
    【解决方案2】:

    你需要在除法之后去掉余数。您可以为此使用Math.floor()

    class Coins {
      public static void main (String args[]) {
    
         double  money = 1.73;
    
        int dollars = (int) Math.floor(money/1);
        money -= dollars * 1;
    
        int quarters = (int) Math.floor(money/0.25);
        money -= quarters * 0.25;
    
        int dimes = (int) Math.floor(money/0.10);
        money -= dimes * 0.10;
    
        int nickels = (int) Math.floor(money/0.05);
        money -= nickels * 0.05;
    
        int pennies = (int) Math.round(money * 100);
    
        System.out.println("Dollars: " + dollars);
        System.out.println("Quarters: " + quarters);
        System.out.println("Dimes: " + dimes);
        System.out.println("Nickels: " + nickels);
        System.out.println("Pennies: " + pennies);
      }
    }
    

    导致:

    Dollars: 1
    Quarters: 2
    Dimes: 2
    Nickels: 0
    Pennies: 3
    

    【讨论】:

    • @alfasin 很抱歉让你失望了,但我编写了完整的程序,它工作得很好......除了Math.floor() 的一些铸造问题和便士的数量(见更新的答案)
    • 现在你编辑了你的答案 - 它可以工作(删除 -1 并改为 +1),它只是因为你通过添加 dollars * quarters * 等修复了错误。
    • 我没有删除-1...检查revisions of my answer。除了演员表,我的回答没有任何问题。
    • 我没有说你删除了 -1 - 我说我删除了 :)
    • 嘿...误读了!但我也没有更改'dollars *quarters *'......但让我们先把它留在这,因为它与答案无关了
    猜你喜欢
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 2022-01-11
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多