0

配列を反復処理しようとしているJS関数とオブジェクトを初めて使用します...これは、入力値を使用してコインの倍数を取得しようとしたサンプルコードです。

var flag=0;var chipval=0;var num=0;
var main = function(coins){
        var coinsarr = [1,5,10,25,50,100,500,501];var length=coinsarr.length
        var remval = coins;
        var coinskey = "";
        while(flag==0){
            for(i=0;i<length;i++){
                if(coinsarr[i]>remval){
                    chipval = coinsarr[i-1];
                    num = parseInt(remval/chipval);
                    if(remval%chipval==0){
                        flag = 1;
                        break;
                    }else{
                        remval=remval%chipval;
                        $flag = 0;
                        break;
                    }
                }
            }
            coinskey = coinskey+","+chipval+":"+num;
        }
        coinskey = coinskey.replace(/(^,)|(,$)/g, "")
        alert(coinskey);
    }

main(120)を実行すると、100:2,10:2が返されます(これは、2の100コインと2の10コインでは何もありません)

main(720)を実行すると、メモリリークが発生します...「このページのスクリプトはメモリを使いすぎました」と表示されます。誰かが私に問題がどこにあるか、そうでなければこれが進むための正しい方法であるかを教えてもらえますか?

あなたの時間と忍耐に感謝します...

4

2 に答える 2

1

関数に渡す値が配列の最大値より大きい場合、flag決して変更されないため、無限ループになります。

具体的には、このifステートメントの条件は次のとおりです。

if(coinsarr[i]>remval){

720... (または)以外の数には当てはまりません501

また、すべきでは$flag = 0ありませんflag = 0か?$flag現状では、決して使用されないグローバル変数を作成します。

于 2013-01-28T07:35:50.943 に答える
1

値を構成するコインの量を取得するための少しクリーンなオプションは、値を含むオブジェクトを作成することです。このような何かがトリックを行います:

function coins(value){
    var coinsarr = [1,5,10,25,50,100,500,501];
    var out = {};
    while(value > 0){
        var i = 0;
        while(coinsarr[i+1] <= value){
            i++; // Find the coin to add.
        }
        var coin = coinsarr[i];
        value -= coin;
        if(!out[coin]){
            out[coin] = 0;
        }
        out[coin]++;
    }
    return out;
}

coins(499);
// {        Returns:
//     1: 4
//     10: 2
//     25: 1
//     50: 1
//     100: 4
// }
coins(21359);
// {        Returns:
//     1: 2
//     5: 1
//     10: 1
//     100: 3
//     501: 42
// }

これの利点は、文字列を解析するよりも簡単に値を取得できることです。

var coinsObj = coins(499);
for(var key in coinsObj){
    console.log(coinsObj[key] + ' times coin "' + key + '"' );
}
// 4 times coin "1"
// 2 times coin "10"
// 1 times coin "25"
// 1 times coin "50"
// 4 times coin "100"

または、次のような文字列を作成します。

var coinsObj = coins(499);
var outString = ''
for(var key in coinsObj){
    outString += ',' + key + ':' + coinsObj[key];
}
outString = outString.substr(1); // Remove the leading comma.
于 2013-01-28T07:53:52.997 に答える