網易面試題,最大奇約數
阿新 • • 發佈:2018-11-17
題意:
小易是一個數論愛好者,並且對於一個數的奇數約數十分感興趣。一天小易遇到這樣一個問題: 定義函式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; }