You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 23:15:00