奇数最大奇约数是本身,偶数最大奇约数是除以所有偶因子后的那个奇数
所以当计算num的最大的奇约数之和可以转换为
- 1.计算所有奇数的最大奇约数之和+所有偶数的最大奇约数之和
- 2.所有偶数的最大奇约数之和可以转换为/2之后,计算所有奇数的最大奇约数之和+所有偶数的最大奇约数之和
- 3.循环第二步,直到num为0
例: 计算num=10的最大的奇约数之和
- 1.计算(1 3 5 7 9)的最大奇约数之和等于25 加上 (2 4 6 8 10)的最大奇约数之和
- 2.(2 4 6 8 10)的最大奇约数之和可以转换为 计算(1 2 3 4 5) 的最大奇约数之和
- 3.(1 2 3 4 5)的最大奇约数之和可以转换为计算 (1 3 5)的最大奇约数之和等于9 + (2 4)的最大奇约数之和
- 4.(2 4)的最大奇约数之和可以转换为计算 (1 2)的最大奇约数之和 指导所有偶数都转换为奇数之后计算结束
unsigned long long GetAllMaxOddNumberOddApproximateSum(int num) { // 获取所有奇数的最大奇约数之和
unsigned long long sum = 0;
for (int i = 1; i <= num; i+=2) {
sum += i;
}
return sum;
}
unsigned long long GetAllMaxOddApproximateSum2(int input) {
unsigned long long sum = 0;
while (input) {
sum += GetAllMaxOddNumberOddApproximateSum(input);
input = input / 2; // 计算/2后所有的奇数的和 说明这些值不能再除2了(因为偶数最大奇约数是除以所有偶因子后的那个奇数) 循环到input为0
}
return sum;
}