来源是一道简单的模拟题但是在处理环形索引的地方出现了问题题目洛谷模拟与高精度 玩具谜题输入的第一行包含两个正整数 n,m表示玩具小人的个数和指令的条数。接下来 n 行每行包含一个整数和一个字符串以逆时针为顺序给出每个玩具小人的朝向和职业。其中 0 表示朝向圈内1 表示朝向圈外。保证不会出现其他的数。字符串长度不超过 10 且仅由英文字母构成字符串不为空并且字符串两两不同。整数和字符串之间用一个空格隔开。接下来 m 行其中第 i 行包含两个整数 ai,si表示第 i 条指令。若 ai0表示向左数 si 个人若 ai1表示向右数 si 个人。 保证 ai 不会出现其他的数1≤sin。解法#includeiostream#includestringusing namespace std;int main(){int side[10000];//朝向string job[10000];//职业int m,n;int p, q;//p为左右q为第几个人cin n m;//小人的个数和指令的条数for (int i 0; i n; i){cin side[i] job[i];}int whichone 0;for (int j 0; j m; j){cin p q;if (side[whichone] 0)//内{if (p 0){whichone (whichone-q%nn)%n;}elsewhichone (whichone q % n n) % n;}else{if (p 0){whichone (whichone q % n n) % n;}elsewhichone (whichone - q % n n) % n;}}cout job[whichone];return 0;}这里面的核心语句就是whichone (whichone-q%nn)%n;所以经过一些个人的学习遂记录以whichone (whichone-q%nn)%n;举例这是要左移int whichone0但是0左移后会成为负数无法被读取为了保证索引的区间在0~n-1中间要使用环形索引。这句话可以被拆解为三个部分1-q%n这个是为了防止冗余计算增加计算量。在一个三人环中左移300次就没变位置因此取余来减小计算量。2(***n)%n这个是为了保证whichone在范围内。补充从其他题目发现的有关于环形的小用法一个数组arr[]中总长度为n一个循环的长度为na。for(int i0;in;i){coutarr[i%na];//当i正好循环到末尾的时候置0开启下一个循环}