最大奇约数

给出一个正整数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 类型转换,否则发生溢出

posted @ 2016-09-14 10:07  苏苏苏紫Sue  阅读(631)  评论(0编辑  收藏  举报