[R25A]小Z老师的拼数游戏0


数据规模:aa 的位数 nnbb 的位数 mm 满足 1n,m1001 \le n, m \le 100a1a \ge 1b0b \ge 0,且 a,ba, b 均不含前导 00

思路

由于 a,ba, b 的位数可达 100100,远超任何整型范围,直接按字符串处理即可。整体就是一个纯模拟:

  1. bb 的字符序列反转,得到 bb'
  2. 跳过 bb' 开头的所有前导 00(但要保留至少一个字符,即 b=0b = 0 时结果仍是 "0");
  3. 把处理后的 bb' 拼到 aa 的末尾,输出拼接结果。

一个等价但更简洁的观察:跳过前导 00 等价于「找到第一个非 00 的位置开始截取;若全为 00 则取最后一个 00」。这样只需一次线性扫描。

复杂度

时间 O(n+m)O(n + m),空间 O(n+m)O(n + m)

仓颉实现

import std.env.*

main(): Int64 {
    let reader = getStdIn()
    let line = reader.readln().getOrThrow().split(" ", removeEmpty: true)
    let a = line[0]
    let b = line[1]

    // 将 b 翻转得到 b',用字节列表处理
    let m = b.size
    var arr = Array<UInt8>(m, { _ => 0 })
    for (i in 0..m) {
        arr[m - 1 - i] = b[i]
    }

    // 去除前导 0(保留至少一个字符)
    var start: Int64 = 0
    while (start < m - 1 && arr[start] == 0x30u8) {
        start += 1
    }

    let sb = StringBuilder()
    sb.append(a)
    var j = start
    while (j < m) {
        sb.append(Rune(UInt32(arr[j])))
        j += 1
    }
    println(sb.toString())
    return 0
}