• 最大奇约数


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

  • 相关阅读:
    Kindle Book Resource
    Windows远程桌面
    python列表常用方法
    python字符串操作简单方法
    PCA降维实验代码
    android底部菜单栏的编写
    android UI:Fragment碎片
    android开发学习——day8
    android开发学习——day7
    android开发学习——day6
  • 原文地址:https://www.cnblogs.com/rainySue/p/qi-yue-shu.html
Copyright © 2020-2023  润新知