奇数最大奇约数是本身,偶数最大奇约数是除以所有偶因子后的那个奇数

所以当计算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;
}