用C++编写程序:x为正整数,函数f(x)表示x的最大奇约数,如: f(44) = 11。要求编写函数sum(N),N为正整数,使得 sum(N)= f(1) + f(2) + f(3) + … + f(N) 例如: sum(7) = f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 + 1 + 5 + 3 + 7 = 21 输入格式: 输入在一行中给出1个正整数N。 输出格式: 输出sum(N)的值。 输入样例: 7 输出样例: 21
时间: 2023-07-16 09:16:15 浏览: 87
下面是一份C++代码实现:
```cpp
#include <iostream>
using namespace std;
int f(int x) {
while (x % 2 == 0) {
x /= 2;
}
return x;
}
int sum(int n) {
int res = 0;
for (int i = 1; i <= n; i++) {
res += f(i);
}
return res;
}
int main() {
int n;
cin >> n;
cout << sum(n) << endl;
return 0;
}
```
思路解析:
1. 定义一个函数 `f(x)`,表示 `x` 的最大奇约数。
2. 在 `f(x)` 函数中,使用 `while` 循环不断将 `x` 除以 `2`,直到 `x` 不再是偶数,返回此时的 `x` 值。
3. 定义一个函数 `sum(n)`,表示求 `f(1) + f(2) + f(3) + ... + f(n)` 的值。
4. 在 `sum(n)` 函数中,使用 `for` 循环遍历 `1` 到 `n` 的所有正整数,计算每个数的最大奇约数 `f(i)`,并将它们累加起来。
5. 最后输出累加结果即可。
时间复杂度分析:
该算法的时间复杂度为 $O(n\log n)$,其中 $n$ 是输入的正整数。因为要对 `1` 到 `n` 的每个数都调用一次 `f(x)` 函数,而 `f(x)` 函数的时间复杂度是 $O(\log x)$,所以总的时间复杂度是 $O(n\log n)$。
阅读全文