1 条题解
-
0
自动搬运
来自洛谷,原作者为

chen_zhe
Aya 敲可爱的~搬运于
2025-08-24 21:16:54,当前版本为作者最后更新于2024-12-13 23:21:43,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
欢迎报名洛谷网校,期待和大家一起进步!
本题考查字符串的使用。
根据题意, 的位数可以达到 位,使用
int类型、long long类型等都无法存下它们。因此考虑使用字符串作为存储容器,因为字符串的好处就是可以无限延伸,位数不限。接下来介绍一种做法直观,但是不好编写代码的做法:
根据 和 的含义,计算 和 。以计算 为例。假设 的长度是 ,那么 的个位、百位、万位……应当是:(需要注意,字符串的下标是从 到 )。例如对于一个正整数 来说,它的长度是 ,那么应当分别取 ,即分别是 加进 ,答案是 。
重点: 虽然这些字符看起来是数字,但是做运算的时候,数值与看起来的数字完全不同!例如,字符 2,它看起来是 2,其实在做运算中它是 ,因为字符 2 的 ASCII 码是 。因此,对于取出的字符 ,我们需要使用
s1 += x[i] - '0'(或者是s1 += x[i] - 48)的方式让它变为这个字符的面值。(例如: 被视作是 ,而 是 ,即可让 加上 ,而不是 加上 )对于 ,同理应当为 。对于 来说,分别是 和 ,分别是 加进 ,答案是 。
接下来只需判断 和 的余数是否相等了。
但是,这样的做法虽然直观,但是在编写代码上存在问题。对于字符串
x,可以调用x.length()得到字符串x的长度。但是长度的类型默认是无符号整型。如果字符串的长度为 (即:是个一位数),那么调用x.length()-2,会出现无符号整型的向下溢出,变为一个非常大的数字,可能会导致计算问题。为此,可以定义int类型的变量len预先以int类型存储下字符串的长度,再做 的操作,是安全的。参考代码(部分):
int s1 = 0, s2 = 0, len = x.length(); for (int i = len - 1; i >= 0; i -= 2) s1 += x[i] - '0'; for (int i = len - 2; i >= 0; i -= 2) s2 += x[i] - '0';因此,这里介绍一个更好的做法:我们不必纠结于 和 的实际意义!在 这一个例子中, 还是 其实都是一样的,关键在于 和 是错开来交替地选数字的。因此可以将两个
for循环并作一个,交替将数字加入 或 。参考代码(部分):
for (int i = 0; i < x.length(); i++) { if (i % 2 == 0) s1 += x[i] - '0'; else s2 += x[i] - '0'; }当然,可以使用数组,省略这一个
if结构:for (int i = 0; i < x.length(); i++) s[i % 2 + 1] += x[i] - '0'; // 比较 s[1] % 11 和 s[2] % 11 即可
- 1
信息
- ID
- 11124
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 2
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者