计算24

//======================================================
// 算24 C4 1.02
// 整理代码,去掉一些多余冗杂的地方
// 2018年4月23日
//======================================================

//======================================================
// C2类,用于判断两个数通过加减乘除运算能否得到某个结果
// C代表Caculate,2代表两个操作数
// op1:操作数1,op2:操作数2,result,结果
//======================================================
function C2(op1,op2,result){
var obj=new Object();
obj.op1=op1;
obj.op2=op2;
obj.result=result;

obj.findComputeMethods=function(){
    var micro=0.000001 // 定义一个极小量,运算结果绝对值小于它就算相等

    var arr=[];

    // op1+op2
    if(Math.abs(result-(op1+op2))<micro){
        arr.push(op1+"+"+op2);    
    }

    // op1*op2
    if(Math.abs(result-op1*op2)<micro){
        arr.push(op1+"*"+op2);    
    }

    // op1-op2
    if(Math.abs(result-(op1-op2))<micro){
        arr.push(op1+"-"+op2);    
    }

    // op2-op1
    if(Math.abs(result-(op2-op1))<micro){
        arr.push(op2+"-"+op1);    
    }

    // op1/op2
    if(Math.abs(result-op1/op2)<micro){
        arr.push(op1+"/"+op2);    
    }

    // op2/op1
    if(Math.abs(result-op2/op1)<micro){
        arr.push(op2+"/"+op1);    
    }

    return arr;
}

return obj;

}

//======================================================
// C3类,用于判断三个数通过加减乘除运算能否得到某个结果
// C代表Caculate,3代表三个操作数
// op1:操作数1,op2:操作数2,op3:操作数3,result,结果
//======================================================
function C3(op1,op2,op3,result){
var obj=new Object();
obj.op1=op1;
obj.op2=op2;
obj.op3=op3;
obj.result=result;

obj.findComputeMethods=function(){
    var retArr=[];// 最终返回数组

    // 排列数组,三个操作数共有6种排列方式
    var permutationArr=[ 
                        [this.op1,this.op2,this.op3],
                        [this.op1,this.op3,this.op2],
                        [this.op2,this.op1,this.op3],
                        [this.op2,this.op3,this.op1],
                        [this.op3,this.op2,this.op1],
                        [this.op3,this.op1,this.op2], 
                       ]; 

    for(var i=0;i<permutationArr.length;i++){
        var arr=permutationArr[i];
        var op1=arr[0];
        var op2=arr[1];
        var op3=arr[2];

        // [op1,op2]-op3
        var c2=new C2(op1,op2,this.result+op3);
        var methods=c2.findComputeMethods();
        for(var j=0;j<methods.length;j++){
            retArr.push('('+methods[j]+")"+"-"+op3);
        }

        // [op1,op2]/op3
        c2=new C2(op1,op2,this.result*op3);
        methods=c2.findComputeMethods();
        for(var j=0;j<methods.length;j++){
            retArr.push('('+methods[j]+")"+"/"+op3);
        }

        // [op1,op2]+op3
        c2=new C2(op1,op2,this.result-op3);
        methods=c2.findComputeMethods();
        for(var j=0;j<methods.length;j++){
            retArr.push('('+methods[j]+")"+"+"+op3);
        }

        // op3-[op1,op2]
        c2=new C2(op1,op2,op3-this.result);
        methods=c2.findComputeMethods();
        for(var j=0;j<methods.length;j++){
            retArr.push(op3+"-"+'('+methods[j]+")");
        }

        // [op1,op2]*op3
        c2=new C2(op1,op2,this.result/op3);
        methods=c2.findComputeMethods();
        for(var j=0;j<methods.length;j++){
            retArr.push('('+methods[j]+")"+"*"+op3);
        }

        // op3/[op1,op2]
        c2=new C2(op1,op2,op3/this.result);
        methods=c2.findComputeMethods();
        for(var j=0;j<methods.length;j++){
            retArr.push(op3+"/"+'('+methods[j]+")");
        }
    }

    return retArr;
};

return obj;

}

//======================================================
// C4类,用于判断三个数通过加减乘除运算能否得到某个结果
// C代表Caculate,4代表两个操作数
// op1:操作数1,op2:操作数2,op3:操作数3,op4:操作数4,result,结果
//======================================================
function C4(op1,op2,op3,op4,result){
var obj=new Object();
obj.op1=op1;
obj.op2=op2;
obj.op3=op3;
obj.op4=op4;
obj.result=result;

obj.findComputeMethods=function(){
    var retArr=[];// 返回数组

    var permutationArr=[    [this.op1,this.op2,this.op3,this.op4],
                         [this.op1,this.op2,this.op4,this.op3],
                         [this.op1,this.op3,this.op2,this.op4],
                         [this.op1,this.op3,this.op4,this.op2],
                         [this.op1,this.op4,this.op2,this.op3],
                         [this.op1,this.op4,this.op3,this.op2], 
                            [this.op2,this.op1,this.op3,this.op4],
                         [this.op2,this.op1,this.op4,this.op3],
                         [this.op2,this.op3,this.op1,this.op4],
                         [this.op2,this.op3,this.op4,this.op1],
                         [this.op2,this.op4,this.op1,this.op3],
                         [this.op2,this.op4,this.op3,this.op1], 
                            [this.op3,this.op1,this.op2,this.op4],
                         [this.op3,this.op1,this.op4,this.op2],
                         [this.op3,this.op2,this.op1,this.op4],
                         [this.op3,this.op2,this.op4,this.op1],
                         [this.op3,this.op4,this.op1,this.op2],
                         [this.op3,this.op4,this.op2,this.op1], 
                            [this.op4,this.op1,this.op2,this.op3],
                         [this.op4,this.op1,this.op3,this.op2],
                         [this.op4,this.op2,this.op1,this.op3],
                         [this.op4,this.op2,this.op3,this.op1],
                         [this.op4,this.op3,this.op1,this.op2],
                         [this.op4,this.op3,this.op2,this.op1], 
                       ]; // 排列数组,四个操作数共有24种排列方式

    for(var i=0;i<permutationArr.length;i++){
        var arr=permutationArr[i];

        var op1=arr[0];
        var op2=arr[1];
        var op3=arr[2];
        var op4=arr[3];            

        // [op1,op2,op3]-op4
        var c3=new C3(op1,op2,op3,this.result+op4);
        var methods=c3.findComputeMethods();
        for(var j=0;j<methods.length;j++){
            retArr.push('('+methods[j]+")"+"-"+op4);
        }

        // [op1,op2,op3]/op4
        var c3=new C3(op1,op2,op3,this.result*op4);
        var methods=c3.findComputeMethods();
        for(var j=0;j<methods.length;j++){
            retArr.push('('+methods[j]+")"+"/"+op4);
        }

        // [op1,op2,op3]+op4
        var c3=new C3(op1,op2,op3,this.result-op4);
        var methods=c3.findComputeMethods();
        for(var j=0;j<methods.length;j++){
            retArr.push('('+methods[j]+")"+"+"+op4);
        }

        // op4-[op1,op2,op3]
        var c3=new C3(op1,op2,op3,op4-this.result);
        var methods=c3.findComputeMethods();
        for(var j=0;j<methods.length;j++){
            retArr.push(op4+"-"+'('+methods[j]+")");
        }

        // [op1,op2,op3]*op4
        var c3=new C3(op1,op2,op3,this.result/op4);
        var methods=c3.findComputeMethods();
        for(var j=0;j<methods.length;j++){
            retArr.push('('+methods[j]+")"+"*"+op4);
        }

        // op4/[op1,op2,op3]
        var c3=new C3(op1,op2,op3,op4/this.result);
        var methods=c3.findComputeMethods();
        for(var j=0;j<methods.length;j++){
            retArr.push(op4+"/"+'('+methods[j]+")");
        }

        // 以下为C4中特有情况
        // op1*op2-op3*op4
        if(op1*op2-op3*op4==result){
            retArr.push(op1+"*"+op2+"-"+op3+"*"+op4);
        }

        // op1*op2+op3*op4
        if(op1*op2+op3*op4==result){
            retArr.push(op1+"*"+op2+"+"+op3+"*"+op4);
        }

        // op1/op2-op3/op4
        if(op1/op2-op3/op4==result){
            retArr.push(op1+"/"+op2+"-"+op3+"/"+op4);
        }

        // op1/op2+op3/op4
        if(op1/op2+op3/op4==result){
            retArr.push(op1+"/"+op2+"+"+op3+"/"+op4);
        }

        // op1*op2-op3/op4
        if(op1*op2-op3/op4==result){
            retArr.push(op1+"*"+op2+"-"+op3+"/"+op4);
        }

        // op1*op2+op3/op4
        if(op1*op2+op3/op4==result){
            retArr.push(op1+"*"+op2+"+"+op3+"/"+op4);
        }
    }

    return retArr;
}

return obj;

}

//======================================================
// 用来得到仅包含不重复元素的数组
// arr:传入的数组
//======================================================
function getDistinctArray(arr){
var returnArr=new Array();

var sortedArr=arr.sort();
for(var i=0;i<sortedArr.length;i++){
    if(returnArr[returnArr.length-1]!=sortedArr[i]){
        returnArr.push(sortedArr[i]);
    }
}

return returnArr;

}

//======================================================
// 程序入口
//======================================================
function main(){
/*var c4=new C4(6,7,10,10,24);
var arr=getDistinctArray(c4.findComputeMethods());

for(var i=0;i<arr.length;i++){
    console.log(arr[i]+"=24");    
}    */

process.stdin.resume();    
process.stdout.write("\033[33m 请输入四个数字,用逗号分隔: \033[39m");// 草×××
process.stdin.setEncoding('utf8');

process.stdin.on('data',function(text){
    var input=text.trim();
    process.stdin.end();// 退出输入状态  

    var arrTemp=input.split(",");
    var op1=parseInt(arrTemp[0],10);
    var op2=parseInt(arrTemp[1],10);
    var op3=parseInt(arrTemp[2],10);
    var op4=parseInt(arrTemp[3],10);

    var c4=new C4(op1,op2,op3,op4,24);
    var arr=getDistinctArray(c4.findComputeMethods());

    if(arr.length>0){
        for(var i=0;i<arr.length;i++){
            console.log(arr[i]+"=24");    
        }
    }else{
        console.log(input+"这四个数无法计算得到24");
    }
});

}

// 开始
main();
复制代码
输出如下:

复制代码
C:\Users\horn1\Desktop\node.js\56-算24c41.02>node c24.js
请输入四个数字,用逗号分隔: 12,2,3,8
((12-8)2)3=24
((12-8)3)2=24
((12/2)-3)8=24
((12/3)+8)
2=24
((38)-12)2=24
((38)/2)+12=24
((3/2)
8)+12=24
((83)-12)2=24
((83)/2)+12=24
((8-2)
12)/3=24
((8-2)/3)12=24
((8/2)
3)+12=24
(12-(8/2))3=24
(3/(2/8))+12=24
(8-(2
3))12=24
(8-(3
2))*12=24
(8/(2/3))+12=24
12/(3/(8-2))=24

C:\Users\horn1\Desktop\node.js\56-算24c41.02>node c24.js
请输入四个数字,用逗号分隔: 4,4,4,4
((4*4)+4)+4=24

C:\Users\horn1\Desktop\node.js\56-算24c41.02>node c24.js
请输入四个数字,用逗号分隔: 9,9,9,9
9,9,9,9这四个数无法计算得到24

C:\Users\horn1\Desktop\node.js\56-算24c41.02>node c24.js
请输入四个数字,用逗号分隔: 10,10,4,4
((10*10)-4)/4=24

C:\Users\horn1\Desktop\node.js\56-算24c41.02>node c24.js
请输入四个数字,用逗号分隔: 8,8,8,8
8,8,8,8这四个数无法计算得到24

C:\Users\horn1\Desktop\node.js\56-算24c41.02>node c24.js
请输入四个数字,用逗号分隔: 6,6,6,6
((6*6)-6)-6=24
((6+6)+6)+6=24

C:\Users\horn1\Desktop\node.js\56-算24c41.02>node c24.js
请输入四个数字,用逗号分隔: 5,5,5,5
5*5-5/5=24

C:\Users\horn1\Desktop\node.js\56-算24c41.02>node c24.js
请输入四个数字,用逗号分隔: 3,3,3,3
((33)3)-3=24

C:\Users\horn1\Desktop\node.js\56-算24c41.02>node c24.js
请输入四个数字,用逗号分隔: 2,2,2,2
2,2,2,2这四个数无法计算得到24

C:\Users\horn1\Desktop\node.js\56-算24c41.02>node c24.js
请输入四个数字,用逗号分隔: 12,12,12,12
((1212)/12)+12=24
((12+12)
12)/12=24
((12+12)+12)-12=24
((12+12)-12)+12=24
((12+12)/12)12=24
((12-12)+12)+12=24
((12/12)
12)+12=24
(12-(12-12))+12=24
(12/(12/12))+12=24
12-((12-12)-12)=24
12-(12-(12+12))=24
12/(12/(12+12))=24

C:\Users\horn1\Desktop\node.js\56-算24c41.02>node c24.js
请输入四个数字,用逗号分隔: 11,13,4,2
11,13,4,2这四个数无法计算得到24

C:\Users\horn1\Desktop\node.js\56-算24c41.02>node c24.js
请输入四个数字,用逗号分隔: 12,11,13,1
((113)-11)12=24
((131)-11)12=24
((13-11)1)12=24
((13-11)12)1=24
((13-11)12)/1=24
((13-11)/1)
12=24
((13/1)-11)12=24
(13-(1
11))12=24
(13-(11
1))12=24
(13-(11/1))
12=24
12/(1/(13-11))=24

C:\Users\horn1\Desktop\node.js\56-算24c41.02>node c24.js
请输入四个数字,用逗号分隔: 8,7,9,10
(8/(10-7))9=24
(9/(10-7))
8=24
8/((10-7)/9)=24
9/((10-7)/8)=24

猜你喜欢

转载自blog.51cto.com/7726611/2356926