思想
首先搞清楚本题里面的取模规则。
在模3规则下,−1、0、1是怎么变为2、0、1的?
-1%3==2,-1+3=2,2%3=2
0%3=0 ,0模任何数都为0
1%3==1,1模任何数都为任何数
样例解析
20102是怎么变为01210的?
我们从左向右依次遍历:
首先,因为第一位是2,所以我们接下来要进行的操作的是+1操作。需要先对字符串进行对3取模操作,变为20102,然后再进行+1操作变为01210(3进制满3进1)
然后我们再看01210是怎么变为00102的?
首先01210的第一位是0,我们可以跳过。然后第二位是1,因此我们接下来要当前位和以后的位进行-1操作。
当前位1对3取模还是1,然后-1变为0,此时为00210。然后是第三位2,我们对其取模变为2,进行-1操作变为1,此时为00110。然后是第四位1,我们对其取模后再减1,变为0,此时为00100。然后是第五位0,我们对其取模之后减去1,就是0-1,因为是3进制,所以就是3-1,就是2,此时为00102。
code
代码部分我们模拟写就行了,遇到首位为1我们就进行-1操作,遇到首位为0的就进行加1操作。
然后遍历位和之后的每一位,看一下是多少,给出对应的经过运算之后的值。
#include <bits/stdc++.h>
using namespace std;
int ans;
int main() {
string s;
cin >> s;
for (int i = 0; i < s.size(); i++) {
//若当前数字为1,那么就进行-1操作
int n = s.size();
if (s[i] == '1') {
for (int j = i; j <= n; j++) {
//题目给的字符串只会出现0,1,2的情况
switch (s[j]) {
case '1':
s[j] = '0';
break;
case '2':
s[j] = '1';
break;
case '0':
s[j] = '2';
break;
}
}
ans++;
} else if (s[i] == '2') { //若是2那么就要进行+1的操作
for (int j = i; j <= n; j++) {
switch (s[j]) {
case '1':
s[j] = '2';
break;
case '2':
s[j] = '0';
break;
case '0':
s[j] = '1';
break;
}
}
ans++;
}
}
cout << ans << endl;
return 0;
}