Javascript js中大数除以小数的计算方法

Javascript js中大数除以小数的计算方法,javascript,Javascript,例如:总数为1000,使用100/50/20/10/5/1有多少种方法可以等于1000。我对此有了一个想法。但很明显,这并不好。那么有人有其他好的想法来报道它吗 total=prompt('您可以输入数字1-1000,但1000需要很长时间'); 计数=0; t100=总数; 功能货币{ 对于(变量i100=数学楼层(t100/100);i100>=0;i100--){ var t50=t100-i100*100; 对于(变量i50=数学楼层(t50/50);i50>=0;i50--){ va

例如:总数为1000,使用100/50/20/10/5/1有多少种方法可以等于1000。我对此有了一个想法。但很明显,这并不好。那么有人有其他好的想法来报道它吗

total=prompt('您可以输入数字1-1000,但1000需要很长时间');
计数=0;
t100=总数;
功能货币{
对于(变量i100=数学楼层(t100/100);i100>=0;i100--){
var t50=t100-i100*100;
对于(变量i50=数学楼层(t50/50);i50>=0;i50--){
var t20=t50-i50*50;
对于(变量i20=数学楼层(t20/20);i20>=0;i20--){
var t10=t20-i20*20;
对于(变量i10=数学楼层(t10/10);i10>=0;i10--){
var t5=t10-i10*10;
对于(变量i5=数学楼层(t5/5);i5>=0;i5--){
变量t1=t5-i5*5;
计数++;
控制台日志(i100+'100'+i50+'50'+i20+'20'+i10+'10'+i5+'5'+t1+'1');
}
}
}
}
}
警报('总数'+total+'为'+count');
}

money()
不知道它是否正确,但我突然想到一个小主意:

你知道,有了这些钞票/硬币,你总能填到你需要的金额(价值)。如果同时,您假设您将始终为剩余部分选择尽可能高的纸币/硬币,我认为您可以这样做:

如果您使用100张账单,您就有了
下限(值/100)
可能性(您可以使用1 x 100、2 x 100…)

如果不使用100而使用50,则有
下限(值/50)
可能性

如果不使用50而使用20,则有
下限(值/20)
可能性

等等。把这些加起来,你就有了全部的可能性


如果我遗漏了什么,请告诉我。

我不知道如何使用js进行编码,但您可以尝试这样的算法,从时间上讲,这样的算法应该性能更好。我将尽可能清楚地说明:

availableCoins = [100, 50, 20, 10, 5] // all available coins exept 1
numberCoins = availableCoins.Length

mapResults = new Map[(int,int),int]

money(int total, int indexCoin){
  if ( indexCoin == numberCoins ) {
    return 1 // only coin 1 is available, there is only one solution
  }
  elseif ( mapResults.containsKey((total,indexCoin)) ) {
    return mapResults((total,indexCoin)) // if the result has already been computed
  }
  else {
    int count = 0
    int currentCoin = availableCoin[indexCoin]
    int upperbound = floor(total / currentCoin) // compute it before to avoid useless computation
    for (int i = 0; i <= upperbound; i++) {
      count += money(total - i * currentCoin, indexCoin + 1) // we assume only i of the current coin will be use
    }
    mapResults((total,indexCoin)) = count
    return count
  }
}

money(1000, 0)
availableCoins=[100,50,20,10,5]//除1之外的所有可用硬币
numberCoins=availableCoins.Length
mapResults=新地图[(int,int),int]
货币(整数总计,整数索引){
if(indexCoin==numberCoins){
return 1//只有硬币1可用,只有一种解决方案
}
elseif(mapResults.containsKey((总计,索引))){
返回mapResults((total,indexCoin))//如果已经计算了结果
}
否则{
整数计数=0
int currentCoin=availableCoin[indexCoin]
int upperbound=floor(total/currentCoin)//请先计算它,以避免无用的计算

对于(int i=0;i我从我的同事那里得到了一个表达式,它是: //n是总数

Change(n,m) {
    if(n===0) return 0;
    if(n<0 || m === 0) return 0;
    var dimes = [1, 5, 10, 20, 50, 100];
    return (change(n, m-1)+change(n-dimes[m-1], m));
}
变化(n,m){
如果(n==0)返回0;

如果(nHere对你来说是一个副本:你的测试用例有什么不好的地方?我认为它应该在codereview中,然后它很可能是注释的副本:不要运行代码段哇!这是O(n^5)(对吗?)。除非有人赢了我或它死了,否则明天继续评论。一旦你使用一张100美元的钞票,你仍然有很多可能改变剩余金额是的,这就是我所说的“你假设你总是选择可能最高的钞票”例如,如果你用2 x 100,然后用50个尽可能多,然后20个,以此类推,那么应该只有一种可能性,对吗?是的,但在这个假设下,你只能找到一种可能性,我错了吗?也许我不明白你的意思,我在想一台没有100、50……张钞票的自动取款机。它永远不会尝试用我认为的最高可能的帐单填满剩余的部分。其他的帐单也可以是空的/空的。所以是的,你必须考虑其余的所有可能性。我真的很感激你们尽力帮助我。但是我不认为这意味着一个提供改变的现金机器。它更像是。“给定一些美元价值,如1000,找出构成美元价值的所有硬币组合。只有100、50、20、10、5、1(如果可能)。”PS:in js.var miane=[100,50,20,10,5,1],count=0,edu1,edu2;函数货币(num,m){edu1=miane[m],edu2=miane[m+1];for(var i=Math.floor(num/edu1);i>=0;i--{if(num-edu1*i>=0){count++;if(num-edu1*i>0&&edu2){money(num-edu1*i,m+1);}否则{continue;}}}返回计数;}money(1000,0);我尝试过这样的递归函数,但失败了。如果您能帮我找出问题所在,我将非常感谢您。^。^@EchoXiao您所说的失败是什么意思?是输出错误还是存在异常?请注意,您所实现的与我所建议的不完全相同。我执行了此操作,也许我们可以这样解决它:变量dimes=[1,5,10,20,50,100];函数更改(n,m){if(n==0)返回1;if(n