基数为K的乘法

解题思路

这道题目要求我们将两个K进制的数转换为十进制后相乘,然后输出结果。解题步骤如下:

  1. 输入处理:读取基数K和两个K进制数字符串A和B
  2. 进制转换:将K进制的字符串转换为十进制数值
    • 从高位到低位遍历字符串
    • 使用"按权展开法":当前结果 = 前一步结果 × K + 当前位数字
  3. 数值相乘:将转换后的两个十进制数相乘
  4. 结果输出:输出乘积结果

代码注释

#include<bits/stdc++.h>  // 包含常用头文件
using namespace std;
#define ll long long  // 定义long long类型简写

ll k, a, b, c;  // 定义全局变量:基数k,转换后的数a,b,乘积结果c
string s1, s2;  // 存储输入的K进制数字符串

// K进制字符串转十进制数的函数
ll solve(string x){
    ll s = 0;  // 初始化结果为0
    for(char c : x){  // 遍历字符串的每个字符
        s = s * k + (c-'0');  // 核心转换公式:s = s*基数 + 当前位数值
    }
    return s;  // 返回转换后的十进制数
}

int main() {
    // 输入部分
    cin >> k >> s1 >> s2;  // 读取基数k和两个K进制数字符串
    
    // 转换部分
    a = solve(s1);  // 将第一个K进制数转换为十进制
    b = solve(s2);  // 将第二个K进制数转换为十进制
    
    // 计算乘积
    c = a * b;  // 计算两个十进制数的乘积
    
    // 输出结果
    cout << c;  // 输出乘积结果
    
    return 0;  // 程序正常结束
}

关键点说明

  1. 进制转换算法

    • s = s * k + (c-'0') 这行代码实现了K进制到十进制的转换
    • 例如:二进制"1011"转换为十进制:
      • 初始s=0
      • 1: s = 0*2 + 1 = 1
      • 0: s = 1*2 + 0 = 2
      • 1: s = 2*2 + 1 = 5
      • 1: s = 5*2 + 1 = 11
  2. 变量范围

    • 使用long long类型存储结果,可以处理较大的数值
    • 题目保证输入的数字在合理范围内(≤10^5),所以不会溢出
  3. 输入输出

    • 输入格式严格按照题目要求:先基数K,然后两个K进制数
    • 输出直接是十进制乘积,不需要额外格式化

这个解法简洁高效,时间复杂度为O(n),其中n是输入数字的位数,能够很好地解决题目要求。

posted @ 2025-05-13 15:19  季风起  阅读(4)  评论(0)    收藏  举报