B4075 [NOIP-X2018 山东] 11 的倍数
欢迎报名洛谷网校,期待和大家一起进步!
本题考查字符串的使用。
根据题意,int 类型、long long 类型等都无法存下它们。因此考虑使用字符串作为存储容器,因为字符串的好处就是可以无限延伸,位数不限。
接下来介绍一种做法直观,但是不好编写代码的做法:
根据
重点: 虽然这些字符看起来是数字,但是做运算的时候,数值与看起来的数字完全不同!例如,字符 2,它看起来是 2,其实在做运算中它是 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 即可