1. 题目背景与需求分析
这道题目来自上海计算机学会2026年2月月赛丙组,考察的是进制转换的基本概念和字符串处理能力。题目要求我们将一个m进制的数n转换为十进制展开式,但需要省略所有系数为0的项。
在实际编程竞赛中,这类题目通常作为第二题出现,难度适中,主要考察选手的基础编程能力和对题目要求的准确理解。题目给出的数据范围是1<m<10,n≥1且n的位数不超过1000,这意味着我们需要处理可能长达1000位的数字字符串。
提示:虽然题目看起来简单,但处理大数(位数很多)时需要特别注意字符串操作的效率,避免不必要的转换和计算。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解题思路详解
2.1 进制转换的基本原理
首先,我们需要理解m进制数转换为十进制展开式的基本原理。对于一个m进制的数n,假设它有k位数字dₖ₋₁dₖ₋₂...d₁d₀,其十进制值为:
dₖ₋₁×m^(k-1) + dₖ₋₂×m^(k-2) + ... + d₁×m^1 + d₀×m^0
例如,题目中的例子(10101)₂可以展开为:
1×2^4 + 0×2^3 + 1×2^2 + 0×2^1 + 1×2^0
2.2 题目特殊要求处理
题目要求我们省略系数为0的项,这意味着我们需要:
- 遍历数字的每一位
- 检查当前位的数字是否为0
- 如果非0,则输出对应的项
- 注意项之间的"+"号连接,但第一项前面不需要加"+"
2.3 算法设计
基于上述分析,我们可以设计如下算法:
- 输入m和n(n作为字符串处理)
- 计算n的长度len
- 遍历n的每一位字符:
- 将字符转换为数字digit
- 如果digit为0,跳过
- 计算当前位的幂次power = len - 1 - i
- 输出digit*m^power
- 如果不是第一项,在前面输出"+"号
3. 代码实现与解析
3.1 完整代码
cpp复制#include <iostream>
#include <string>
using namespace std;
int main() {
int m;
string n;
cin >> m >> n;
int len = n.length();
bool f
