[R31A]校验码
- 难度 入门
- 时限 1s
- 空限 512m
- 模拟
数据规模:,每串长度为 ,仅含数字 。
思路
直接按题面分两路求和即可。下标从 起,对应 1-based 的位置编号;偶数下标()对应 1-based 的奇数位置,奇数下标()对应偶数位置。
- 把奇数位置(偶数下标)的数字累加得 ,令 。
- 把偶数位置(奇数下标)的数字累加得 ,令 。
- 输出 。
逐字符按 UTF-8 字节取差得到数值(数字 的 ASCII 连续),无需任何额外数据结构。
复杂度:时间 ,空间 。
仓颉实现
import std.console.*
import std.convert.*
func solve(reader: ConsoleReader): Int64 {
let s = reader.readln().getOrThrow()
var oddSum: Int64 = 0
var evenSum: Int64 = 0
for (i in 0..13) {
let d = Int64(UInt32(s.toRuneArray()[i]) - UInt32(r'0'))
if (i % 2 == 0) {
oddSum += d
} else {
evenSum += d
}
}
let c1 = oddSum * 3
let c2 = evenSum
return (c1 + c2) % 10
}
main(): Int64 {
let reader = Console.stdIn
let t = Int64.parse(reader.readln().getOrThrow())
for (_ in 0..t) {
println(solve(reader))
}
return 0
}
要点:
- 每组只读一整行字符串,下标 求和后乘 得 ,下标 求和得 。
- 通过
s.toRuneArray()按下标取 Rune,再UInt32(rune) - UInt32(r'0')转成数字值,避免s[i]返回字节带来的语义歧义。 - 组逻辑封装在
solve(),main只负责读 并循环调用。