【问题标题】:Display all combination of coins (quarter, dime, nickel, penny) equal to X显示等于 X 的所有硬币组合(25 美分硬币、1 美分硬币、5 美分硬币、1 美分硬币)
【发布时间】:2014-09-21 15:31:24
【问题描述】:

编写一个程序,要求用户输入一个美元金额 X。显示所有等于 X 的硬币(四分之一、一角、镍、一分钱)组合。输入美元金额 $:1.2 4 四分之一,2 一角,0 镍,0便士 3 季度,4 毛钱,1 镍,0 便士......

package p1;

public class Combination {

    public static void findCombination(Double value){

        int totalCents = (int) (value*100);

        int aq = totalCents/25;
        int ad = totalCents/10;
        int an = totalCents/5;
        int ap = totalCents;

        for(int q=0; q<= aq; q++){

            for(int d=0; d<= ad; d++){

                for(int n=0;n<= an; n++){

                    for(int p=0;p<=ap; p++){

                        if(((q*25) + (d*10) + (n*5) + p ) == totalCents){

                            System.out.println("Q: "+q+" D: "+d+" N: "+n+" P: "+p );

                        }
                    }
                }
            }
        }

还有比这更优化的解决方案吗,我想不到。

【问题讨论】:

标签: java


【解决方案1】:

您可以编辑 for 循环的布尔值中使用的最大值。并且可能会颠倒顺序。

类似:

int p=0, n=0, d=0, q=0;
for(p=0; p <= (totalcents-q*25-d*10-n*5) ; p++){

    for(n=0; (n*5) <= (totalcents-q*25-d*10) ; n++){

        for(d=0; (d*10) <= (totalcents-q*25) ; d++){

            for(q=0; (q*25) <= totalcents ; q++){

                if(((q*25) + (d*10) + (n*5) + p ) == totalCents){

                    System.out.println("Q: "+q+" D: "+d+" N: "+n+" P: "+p );

                }
            }
        }
    }
}

我还没有测试过它是否会加速你的代码,但是在 X 的值非常大时,它可能会比通过 Q D N P 的所有可能值更快,因为最大值会减小。

这种方式你也不需要:

int aq = totalCents/25;
int ad = totalCents/10;
int an = totalCents/5;
int ap = totalCents;

【讨论】:

  • 您在定义之前使用了 q,d 和 n。也许你打错字了?
  • 但是现在您如此努力地颠倒了顺序,以至于您最终回到过去为过去评估的表达式提供值。
  • 我试图提前考虑代码在订单翻转时运行时会做什么,但似乎它最终会执行相同的过程,开始快速并在达到美分时放慢速度。我不能 100% 确定哪个订单更快,所以你应该测试一下。但是更改 for 循环的最大值肯定会减少运行时间@harold。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多