1. 程式人生 > >網易面試題,最大奇約數

網易面試題,最大奇約數

題意:

小易是一個數論愛好者,並且對於一個數的奇數約數十分感興趣。一天小易遇到這樣一個問題: 定義函式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;
}