解题思路

巧妙的转换思路:

  1. 将第 个数转换为二进制
  2. 将二进制每一位对应 的幂
  3. 1表示取该位的 的幂,0表示不取
  4. 最后将所有取到的幂相加

例如:

代码

#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()

算法及复杂度

  • 算法:二进制转换
  • 时间复杂度: 的二进制位数
  • 空间复杂度:,存储二进制字符串