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"]

 

 

你可能感兴趣的:(Javascript)