解题思路
巧妙的转换思路:
- 将第 个数转换为二进制
- 将二进制每一位对应 的幂
- 1表示取该位的 的幂,0表示不取
- 最后将所有取到的幂相加
例如: 时
代码
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
// 转换为二进制字符串
string binary = "";
while (k > 0) {
binary = (char)('0' + k % 2) + binary;
k /= 2;
}
// 计算结果
long long sum = 0;
for (int i = 0; i < binary.length(); i++) {
if (binary[i] == '1') {
sum += pow(n, binary.length() - i - 1);
}
}
cout << sum << endl;
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // 进制基数
int k = sc.nextInt(); // 第k个数
// 转换为二进制字符串
String binary = Integer.toBinaryString(k);
// 计算结果
long sum = 0;
for (int i = 0; i < binary.length(); i++) {
// 如果当前位是1,加上对应的n的幂
if (binary.charAt(i) == '1') {
sum += Math.pow(n, binary.length() - i - 1);
}
}
System.out.println(sum);
}
}
def solve():
n, k = map(int, input().split())
# 转换为二进制字符串
binary = bin(k)[2:] # 去掉'0b'前缀
# 计算结果
sum_val = 0
for i in range(len(binary)):
if binary[i] == '1':
sum_val += n ** (len(binary) - i - 1)
print(sum_val)
if __name__ == "__main__":
solve()
算法及复杂度
- 算法:二进制转换
- 时间复杂度:, 的二进制位数
- 空间复杂度:,存储二进制字符串