JavaScript中for循環嵌套編程小案例

編寫一個函數用於實現金額組合:面額分別有1元、2元、5元的紙幣共計N張,現需要付出M元,統計共有幾種付法。N、M是用戶輸入的值。(有10張紙幣,面額分別是1元、2元、5元,現需要付出18元,通過編程統計出共有幾種付法。)

思考:JS中for循環嵌套有什麼特點?

參考代碼:

方案1:

 /*  設1元a張,2元b張,5元c張
  */
        function f(N, M) {
            var arr = [];
            for (var a = 0; a <= N; a++) {
                for (var b = 0; b <= N; b++) {
                    for (var c = 0; c <= N; c++) {
                        if (a + 2 * b + 5 * c == M && a + b + c == N) {
                            arr.push(a + ',' + b + ',' + c);
                        };
                    }
                }
            }
            if (arr.length == 0) {
                console.log("無解");
            } else {
                console.log(arr);
            }

        }
        f(10, 23);//=>["2,8,0", "5,4,1", "8,0,2"]

方案2

        /* 轉換爲數學問題
        設1元a張,2元b張,5元c張,列出方程組
        a+b+c=N
        a+2b+5c=M
        獲得關係式
        b+4c=M-N
        0≤N - b - c
        (M-N)爲常數,因此問題本質是用JS解決一個一元一次直線方程在限定範圍內的非負整數解,類似線性規劃的非負整數解。     
        */

        function f1(N, M) {
            var arr = [];
            for (var b = 0; b <= M - N; b++) {
                for (var c = 0; c <= M - N; c++) {
                    var a = N - b - c;
                    if (b + 4 * c == M - N) {
                        if (a >= 0) {
                            arr.push(a + ',' + b + "," + c);
                        }
                    }
                }
            }

            if (arr.length !== 0) {
                console.log(arr);

            } else {
                console.log("無解");
            }

        }

         f1(10, 18);  //=>["8,0,2", "5,4,1", "2,8,0"]

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章