java中的最小变化贪婪算法
好的,所以我需要做一个程序来问我要多少钱,然后我需要它来告诉我最少要多少硬币。我可以使用的硬币有:美元、25美分、一角硬币、五分镍币和便士。例如,当我运行程序时,它应该是这样的:java中的最小变化贪婪算法,java,double,minimum,greedy,Java,Double,Minimum,Greedy,好的,所以我需要做一个程序来问我要多少钱,然后我需要它来告诉我最少要多少硬币。我可以使用的硬币有:美元、25美分、一角硬币、五分镍币和便士。例如,当我运行程序时,它应该是这样的: > 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
> 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,但是它把其他语句的流程弄乱了。请帮帮我。你需要去掉除法后的剩余部分。您可以为此使用:
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
您应该将
地板
与铸造结合使用,以双
,以下代码有效:
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;
}
}
}
}
您遇到的另一个bug:你应该减去
Math.floor(money/XXX)*(double)XXX
而不是(double)XXX
@alfasin很抱歉让你失望,但我写了完整的程序,它运行得很好。。。除了一些关于Math.floor()
的铸造问题和你编辑答案后的硬币数量(见更新的答案)之外,它将起作用(删除-1并改为+1),而且它只起作用,因为你通过添加美元*
和四分之一*
等来修复错误。我没有删除-1
。。。检查一下。除了演员阵容之外,我的回答没有错。我不是说你移除了-1-我是说我移除了:)嘿。。。误读了!但我也没有换“美元*
和四分之一*
”。。。但是让我们就此结束吧,因为它与答案没有任何关系。为什么要使用while
-loop('挂起'应用程序)、if
-语句(不做任何事情)和冗余的Math.floor()
调用每种硬币类型。。?我猜你(也)没有尝试你的实现?@Veger关于冗余的观点很好!虽然我确实测试了我的代码(使用了一些测试用例),但它确实工作正常:)