上海计算机学会2026年2月赛丙组T2奇怪的展开式题解

奇怪的展开式

内存限制: 256 Mb时间限制: 1000 ms

题目描述

小明刚学会了进制转换,他想到了一个有趣的写法。

对于一个 m进制的数 n,比如 (10101)2,它可以写成这样的十进制展开式:

1×24+0×23+1×22+0×21+1×20

小明觉得这个式子写出来很好看,但他不想看到系数为 0 的项,因为那样太啰嗦了。

现在给定一个 m 进制数 n,请你帮小明写出它的十进制展开式,并且把系数为 0的项都省略掉。

输入格式

输入一行两个整数 m 和 n,中间用空格隔开。m 表示进制,n 是该进制下的一个数。

输出格式

输出一行,为省略了系数为 0 的项之后的十进制展开式。

数据范围

对于 100% 的数据,1<m<10,n≥1且 n 的位数不超过 1000。

样例数据

输入:

6 11400514

输出:

1*6^7+1*6^6+4*6^5+5*6^2+1*6^1+4*6^0

题解:这个题目很简单,直接定义一个字符串m,输入字符串存储到m里面,计算长度后,从高位到低位逐个判断是否为0,非0的话直接输出。

代码:

#include <iostream>
#include <string>
using namespace std;

int main() {
    int m;
    string n;
    cin >> m >> n;

    int len = n.length();
    bool first = true;  // 控制是否输出 '+'

    for (int i = 0; i < len; i++) {
        int digit = n[i] - '0';
        if (digit == 0) continue;  // 跳过系数为0的项

        if (!first) {
            cout << "+";
        }
        first = false;

        int power = len - 1 - i;
        cout << digit << "*" << m << "^" << power;
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值