我很难找到一个数(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();;
}
有什么方法可以优化我的算法?
答案 0 :(得分:3)
您在问错问题。问题不在于您找到最大奇数因子的速度太慢,而是您求和的算法太慢,而不是这一部分太慢。
例如,每个奇数的最大奇数因子是数字本身,并且存在一个公式,用于计算前n个奇数之和。为什么不使用它来减少致电biggestOddFactor
的次数?那只是给初学者的。
任何偶数的最大奇数因子与该偶数的最大奇数因子相同。因此,最大的奇数因子之和(例如16、14、12和10)与8、7、6和5的奇数因子之和相同。但是,您要分别计算这两个范围吗?为什么?
以此类推。您需要优化算法,而不是错误算法的实现。上面的概念提出了几种可能更快的递归实现。
我只是使用更好的算法very quickly whipped up a solution来解决此问题,它比仅对每个数字调用biggestOddFactor
快数千倍。请注意,我的解决方案是递归的。
在尝试对实现进行微优化之前,您应该始终考虑算法优化。回报往往更大,结果却不那么脆弱。