题目
我们已经知道 2 进制到 10 进制表示方法,与 16 进制类似,我们考虑 11~36 进制,即用 a 代表 10 ,b 代表 11 等。
我们想知道给定一个 10 进制数 n ,其在 2 ~36 进制下的所有进制表示中,含有 1的数量最多是多少。
比如 4 在二进制下表示为 (100)2 ,只有一个 1。
输入描述
在一行上输入一个整数 n(1<=n<=3*10^5)n 代表给定的十进制数。
输出描述
在一行上输出一个整数表示答案。
示例 1
输入
4
输出
2
说明
在 3 进制下,4 为 (11)3 ,有两个 1 。
示例 2
输入
11
输出
3
说明
在 2 进制下,11有三个 1 。
这个问题的核心是要找到一个十进制数在不同进制表示下,包含数字 "1" 的数量最多的情况。我们需要遍历从 2 到 36 进制,并计算每个进制下表示时含有 "1" 的数量,然后取其中最大值。
实现思路
- 转换进制:对于每个从 2 到 36 的进制,使用循环和取模运算,将给定的十进制数转换为相应进制的表示形式。
- 计数 "1" 的数量:在每个进制表示中,计算 "1" 出现的次数。
- 记录最大值:比较所有进制下 "1" 的数量,记录最大值。
具体步骤
- 遍历从 2 到 36 的所有进制。
- 对每个进制,使用循环将数字逐位转换为相应进制的字符串表示。
- 统计每个进制表示中 "1" 的数量。
- 比较并更新最大值。
- 最终输出最大值。
C++ 代码
#include <iostream>
#include <algorithm>
int countOnes(int n, int base) {
int count = 0;
while (n > 0) {
if (n % base == 1) {
count++;
}
n /= base;
}
return count;
}
int maxOnesInBases(int n) {
int maxCount = 0;
for (int base = 2; base <= 36; ++base) {
maxCount = std::max(maxCount, countOnes(n, base));
}
return maxCount;
}
int main() {
int n = 4;
std::cout << maxOnesInBases(n) << std::endl;
return 0;
}