[R49B]减法
数据规模:,。
思路
是 个 9 组成的数,例如 时为 。用 减去 ,等价于求 的 9 的补数:把 左侧补前导零到 位,再让每一位 变成 。例如 ,每位正是 、、。
注意当 (即 个 9)时,每一位补数都是 ,结果为 ;最高位也可能产生前导零,因此最后需要去掉前导零、至少保留一个数字。
由于 最大为 ,结果可达 量级,超出整数范围,全程用字符串 / 字节数组处理即可。
复杂度
时间 ,空间 。
仓颉实现
import std.env.*
import std.convert.*
main(): Int64 {
let reader = getStdIn()
let parts = reader.readln().getOrThrow().split(" ", removeEmpty: true)
let k = Int64.parse(parts[0])
let xStr = parts[1]
let xLen = Int64(xStr.size)
// 把 x 左补前导 '0' 到 k 位
let builder = StringBuilder()
var i = 0
while (i < k - xLen) {
builder.append(r'0')
i++
}
builder.append(xStr)
let padded = builder.toString()
// 每位做 9 的补数:结果位 = '9' - (c - '0')
let out = Array<UInt8>(k, { idx: Int64 =>
let c = padded[idx]
57u8 - (c - 48u8)
})
// 去掉前导零,保留至少一个数字
var start = 0
while (start < k - 1 && out[start] == 48u8) {
start++
}
let s = start
let trimmed = Array<UInt8>(k - s, { idx: Int64 => out[s + idx] })
println(String.fromUtf8(trimmed))
return 0
}