C++ Circular Array右移代码结果不符修正及结果回写问题
问题分析
你当前的代码赋值逻辑实际实现的是数组左移shift位,和你需要的右移逻辑不符,同时没有将临时数组的结果回写到原数组vec,因此无法满足需求。
修改方案
- 调整元素映射规则:将原来的
B[(i+shift)%5]=vec[i]改为B[(i + (5 - shift % 5)) % 5] = vec[i],即可实现右移shift位的效果,加shift%5是为了兼容shift大于等于数组长度的场景 - 临时数组赋值完成后,将
B的元素全部拷贝回原数组vec,实现修改原数组的需求 - 可选优化:将数组长度作为参数传入函数,避免硬编码固定长度5,提升代码通用性
修改后的完整代码
通用版本(支持任意长度数组)
#include <iostream> using namespace std; // 增加数组长度参数len,支持任意长度数组 void circularShift(int *vec, unsigned int len, unsigned int shift); int main() { int vec[5] = { 0, 1, 5, 3, 4 }; circularShift(vec, 5, 4); // 输出原数组验证结果 for(int i = 0; i < 5; i++){ cout << vec[i]; } return 0; } void circularShift (int *vec, unsigned int len, unsigned int shift) { // 处理shift大于数组长度的情况 shift = shift % len; int *B = new int[len]; for (int i = 0; i < len; i++) { // 右移逻辑赋值 B[(i + (len - shift)) % len] = vec[i]; } // 结果回写到原数组 for(int i = 0; i < len; i++) { vec[i] = B[i]; } delete[] B; }
固定长度版本(仅修改原有硬编码逻辑)
#include <iostream> using namespace std; void circularShift(int *vec, unsigned int shift); int main() { int vec[5] = { 0, 1, 5, 3, 4 }; circularShift(vec, 4); for(int i = 0; i < 5; i++) { cout << vec[i]; } return 0; } void circularShift (int *vec, unsigned int shift) { int B[5]; shift = shift % 5; for (int i = 0; i < 5; i++) { B[(i + (5 - shift)) % 5] = vec[i]; } // 回写原数组 for(int i = 0; i < 5; i++) { vec[i] = B[i]; } }
上述代码运行后输出结果为40153,和预期一致,且原数组vec已经被修改为移位后的结果。
内容的提问来源于stack exchange,提问作者User1738
相关产品推荐
相关产品推荐

