如何找到一个数字的最大奇数和?

时间:2018-12-27 05:49:23

标签: c++ math

我很难找到一个数(F(x))和F(x)= f(1)+ f(2)+ ... + f(x)的最大奇数因子之和。如您所知,最大因子1是1、2是1、3是3、4是1,依此类推...

例如,数字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的另一种方法,但只能产生77/100

#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 个答案:

答案 0 :(得分:3)

您在问错问题。问题不在于您找到最大奇数因子的速度太慢,而是您求和的算法太慢,而不是这一部分太慢。

例如,每个奇数的最大奇数因子是数字本身,并且存在一个公式,用于计算前n个奇数之和。为什么不使用它来减少致电biggestOddFactor的次数?那只是给初学者的。

任何偶数的最大奇数因子与该偶数的最大奇数因子相同。因此,最大的奇数因子之和(例如16、14、12和10)与8、7、6和5的奇数因子之和相同。但是,您要分别计算这两个范围吗?为什么?

以此类推。您需要优化算法,而不是错误算法的实现。上面的概念提出了几种可能更快的递归实现。

我只是使用更好的算法very quickly whipped up a solution来解决此问题,它比仅对每个数字调用biggestOddFactor快数千倍。请注意,我的解决方案是递归的。

在尝试对实现进行微优化之前,您应该始终考虑算法优化。回报往往更大,结果却不那么脆弱。