给出一个正整数n,求1到n的最大奇约数之和。
思路
观察1,2,3,4,5,6,7,8
他们的最大奇约数为1,1,1,3,1,5,3,7,1.
规律:
- 奇数的最大奇约数是其自身
- 偶数的最大奇约数是其一直除以二得到的首个奇数
方法:
挑出n中所有奇数,求和。对于剩下的偶数,除以2,再挑出其中的所有奇数求和。一直重复直到只剩1。
记结果为f(n),f(n) = 小于等于n的所有奇数之和加上f(n/2)。
程序
long long int Fun(int n)
{
long long int result = 0;
int up;
int tmp = n;
while(n)
{
if(n % 2 == 0)
up = n - 1;
else up = n;
//所有奇数组成的等差数列之和,首项为1,末项为up,项数为(up - 1) / 2 + 1
long long int tmp = (long long)(1 + up) * ((up - 1) / 2 + 1) / 2;//tip1
result += tmp;
n /= 2;
}
if(result < 0)
{
cout << tmp << endl;
}
return result;
}
特别需要注意的是,tip1处赋值式右边的值应该加上long long 类型转换,否则发生溢出