一个小算法记录

下午js群里在讨论一个问题。

function a(n){
    var arr = [];
    for (var a = 0; a < 10; a ++){
        for (var b = 0; b < 10; b ++){
            for (var c = 0; c < 10; c ++){
                if(a+b+c == n){
                    arr.push([a,b,c])
                }
            }
        }
    }
    return arr;
}
console.log(a(4));

请问,这样一个算3位和值的函数,有没有方法写成任意位数的?

输出:一个小算法记录_第1张图片


我的解决方案:

	//获取n的所有位的和。
	function getSum(n){
		var y=0;
		n = parseInt(n);
		while(n>=1 && (n%10>=1 || n%10 == 0)){
			y = n%10+y;
			n = parseInt(n/10);
		}
		return y;
	}

	//num如果不足n位,前端补0.
	function addZero(num,n){
		var zeroNum = n-num.toString().length;
		var itemString='';
		while(zeroNum--){
			itemString+='0';
		}
		return itemString+num;
	}
	
	//n位求和sum。
	function b(sum,n){
		var resString,resArr=[],res=[],item,itemArr=[];
		var all = Math.pow(10,n) - 1;
		for (var i = 0; i <= all; i++) {
			item = getSum(i);
			if(item == sum){				
				resString = addZero(i,n);
				resArr.push(resString.split(""));
			}
		}
		console.log(JSON.stringify(resArr));
	}
	b(36,5);
	b(4,3);


输出:


题主优化后:

	function bb(sum,n){
    var resString,resArr=[],item;
    var all = Math.pow(10,n);
    for (var i = 0; i < all; i++) {

        item = i.leftpad(n, 0).split('').reduce(function(a,b){return parseInt(a)+parseInt(b);});
        if(item == sum){
            resString = i.leftpad(n, 0);
            resArr.push(resString.split(''));
        }
    }

     return resArr;
}


不过这种解决也就只限于题目中的每一位都是0-9这种情况。


你可能感兴趣的:(JavaScript)