网易面试题,最大奇约数

题意:

小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11.
现在给出一个N,需要求出 f(1) + f(2) + f(3)…f(N)
例如: N = 7
f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 + 1 + 5 + 3 + 7 = 21
小易计算这个问题遇到了困难,需要你来设计一个算法帮助他。

翻译成:
约数,又称因数。
给定一个数,如10,它的约数是1,2,5,10,最大奇约数就是5,(全部约数里面最大的那个奇数),现在给定一个n,求1-n内每个数的最大奇约数的和。

思路:
奇数的最大奇约数是自身, 偶数的最大奇约数是是除去所有偶因子之后的那个奇数。
1 2 3 4 5 6 7 8 9 10 统计答案 1 3 5 7 9

剩下了 2 4 6 8 10 现在每个数/2

1 2 3 4 5 统计答案 1 3 5

剩下了 2 4 每个数/2

1 2 统计答案 1

剩下了 2 每个数/2

1 统计答案 1

#include <iostream>
using namespace std;
int main() {
    long long N;
    cin >> N;
    long long result = 0;
    for (long long i = 1; i <= N; ++i) {
        int temp = i;
        while (temp % 2 == 0) {
            temp /= 2;
        }
        result += temp;
    }
    cout << result << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/a1023182899/article/details/83903080