代码之家  ›  专栏  ›  技术社区  ›  Andra

如何求一个数的最大奇数因子之和?

  •  -3
  • Andra  · 技术社区  · 6 年前

    我有一个问题,求一个数的最大奇数因子(F(x))和F(x)=F(1)+F(2)+…+F(x)之和。如你所知,1的最大因子是1,2是1,3是3,4是1,依此类推。。。

    e、 一个数6的最大奇数因子之和为f(1)+f(2)+f(3)+f(4)+f(5)+f(6),即1+1+3+1+5+3或14。

    我想试着解一个数,直到2*10^9

    这是我的f(x)的代码,它在超时之前得到82/100

    unsigned long long int biggestOddFactor(unsigned long long int n){
        //!(n & (n - 1))
        while(n%2 == 0){
            n /= 2;
        }
        return n;
    }
    

    removing the zero on the last bit of a number

    #include <bitset>
    
    unsigned long long int biggestOddFactorUsingBinary(unsigned long long int n){
        std::string bin = std::bitset<32>(n).to_string();
        int delet = 0;
        for(int i = bin.length()-1; i >= 0; i--){
            if(bin[i] == '0'){
                delet += 1;
            }else{
                break;
            }
        }
        bin = bin.substr(0, bin.length()-delet);
        return std::bitset<32>(bin).to_ulong();;
    }
    

    有没有办法优化我的算法?

    1 回复  |  直到 6 年前
        1
  •  3
  •   David Schwartz    6 年前

    例如,每个奇数的最大奇数因子是数本身,并且有一个计算前n个奇数之和的公式。你为什么不用它来减少你打电话的次数 biggestOddFactor ? 这只是开始。

    任何偶数的最大奇数因子与该数一半的奇数因子相同。因此,16,14,12和10的最大奇数因子之和与8,7,6和5的相同。但是你分别计算这两个范围?为什么?

    等等你需要优化你的算法,而不是你的坏算法的实现。上面的概念提出了几种可能的递归实现,它们的速度要快得多。

    very quickly whipped up a solution 使用更好的算法来解决这个问题,比仅仅调用 最大因素 每一个数字。注意,我的解决方案是递归的。

    你应该 总是 在尝试优化实现之前,先考虑算法优化。回报往往更大,结果也不那么脆弱。