这可能是最快的自幂数算法

这可能是最快的自幂数算法

  • 自幂数是指一个 n 位数,它的每个位上的数字的 n 次幂之和等于它本身。(例如:当n为3时,有1^3 + 5^3 + 3^3 = 153,153即是n为3时的一个自幂数)
  • 自幂数包括:独身数、水仙花数、四叶玫瑰数、五角星数、六合数、北斗七星数、八仙数、九九重阳数、十全十美数
    ---摘自百度百科
  • 最近研究了一下水仙花数,完了之后就自然而然的优化成了计算自幂数的算法...
  • 我的第一版本是 eight1 后来想提升一下计算的效率,就做了两次优化
  • 第一次优化后的是eight2 具体是自己维护了一个代表当前数值的数组,而不再从数值中逐个转换,优化后速度提升了80%大概
  • 第二次优化是最大的,就是提前吧几的几次方算好了,因为我发现实际运行中这个的计算次数是在是太多了....
  • 优化后速度提升了数十倍
  • 代码最初写的是java,后来因为发现js执行更快就改成了js
  • 可以吧代码拷贝走,自己跑一下试试
  • 下面是我在自己电脑上跑的速度对比

    计算6位数

    计算7位数

    计算8位数,因为其他算法太慢了,没有跑

    计算9位数

    计算10位数

'Use strict'
function eight1(len) {
    var cs = [];
    var num = [];
    var max = Math.pow(10,len);
    var arr=[];
    for (var j = 100; j < max; j++) {
        var s = j + "";
        cs = s;
        //num= new int[cs.length];
        var sum = 0;
        for (var k = 0; k < cs.length; k++) {
            num[k] = cs[k] - "0";
            sum +=Math.pow(num[k], cs.length) ;
        }
        if (sum == j) {
            arr.push(j);
        }
        
    }
    console.log("eight1",arr);
}
function eight1_2(len) {
    var result = [];
    for (var i = 0; i <= 9; i++) {
        result[i]=[];
        for (var j = 3; j <= len; j++) {
            
            result[i][j] = Math.pow(i, j)
        }
    }
    var cs = [];
    var num = [];
    var max = Math.pow(10,len);
    var arr=[];
    for (var j = 100; j < max; j++) {
        var s = j + "";
        cs = s;
        var sum = 0;
        for (var k = 0; k < cs.length; k++) {
            num[k] = cs[k] - "0";
            sum += result[num[k]][cs.length];
        }
        if (sum == j) {
            arr.push(j);
        }
    }
    console.log("eight1_2",arr);
}

function eight2(len) {
    var num = [];
    for (let o = 0; o < len; o++) {
        if(o===2){
            num [o]=1;
        }else{
            num [o]=0;
        }
    }
    var cs = 3;
    var len = Math.pow(10, num.length) - 1;
    var c;
    var arr=[];
    for (var j = 100; j < len; j++) {
        var t = 0;
        c = 0;
        num[t]++;
        while (num[t] >= 10) {
            c++;
            num[t] = 0;
            t++;
            num[t]++;
        }
        if (c >= cs) {
            cs++;
        }
        var sum = 0;
        for (var k = 0; k < cs; k++) {
            sum += Math.pow(num[k], cs);
        }
        if (sum == j + 1) {
            arr.push(sum)
        }
    }
    console.log("eight2",arr);
}


function eight2_2(len) {
    var num = [];
    for (let o = 0; o < len; o++) {
        if(o===2){
            num [o]=1;
        }else{
            num [o]=0;
        }
    }
    var arr=[];
    var result = [];
    for (var i = 0; i <= 9; i++) {
        result[i]=[];
        for (var j = 3; j <= len; j++) {
            result[i][j] = Math.pow(i, j)
        }
    }
    var cs = 3;
    var len = Math.pow(10, num.length) - 1;
    var c;
    for (var j = 100; j < len; j++) {
        var t = 0;
        c = 0;
        num[t]++;
        while (num[t] >= 10) {
            c++;
            num[t] = 0;
            t++;
            num[t]++;
        }
        if (c >= cs) {
            cs++;
        }
        var sum = 0;
        for (var k = 0; k < cs; k++) {
            //console.log(result,num[k],cs);
            sum += result[num[k]][cs];
        }
        if (sum == j + 1) {
            arr.push(sum)
        }
    }
    console.log("eight2_2",arr);
}

console.warn("eight1  start");
console.time();
eight1(6);
console.timeEnd();

console.warn("eight1_2  start");
console.time();
eight1_2(6);
console.timeEnd();

console.warn("eight2  start");
console.time();
eight2(6);
console.timeEnd();

console.warn("eight2_2  start");
console.time();
eight2_2(6);
console.timeEnd();

猜你喜欢

转载自www.cnblogs.com/tianZiDiYiHao/p/12123702.html