基数为K的乘法
解题思路
这道题目要求我们将两个K进制的数转换为十进制后相乘,然后输出结果。解题步骤如下:
- 输入处理:读取基数K和两个K进制数字符串A和B
- 进制转换:将K进制的字符串转换为十进制数值
- 从高位到低位遍历字符串
- 使用"按权展开法":当前结果 = 前一步结果 × K + 当前位数字
- 数值相乘:将转换后的两个十进制数相乘
- 结果输出:输出乘积结果
代码注释
#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; // 程序正常结束
}
关键点说明
-
进制转换算法:
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
-
变量范围:
- 使用long long类型存储结果,可以处理较大的数值
- 题目保证输入的数字在合理范围内(≤10^5),所以不会溢出
-
输入输出:
- 输入格式严格按照题目要求:先基数K,然后两个K进制数
- 输出直接是十进制乘积,不需要额外格式化
这个解法简洁高效,时间复杂度为O(n),其中n是输入数字的位数,能够很好地解决题目要求。