解题思路:
一种思路是向后移动,把最后一个数字备份,移动完

num_number - 1次后把最后一个数赋值给第一个

总共移动move_number次

注意

    if(move_number > num_number)

    {

        move_number = move_number % num_number;

    }

move_number有周期性

第二种思路是交换

比如 1 2 3 move_number  = 2      

第一次移动  3 2 1         3 1 2

第二次移动  2 1 3         2 3 1

每次移动都是第一个数到第move_number个数分别和最后一个数交换

注意事项:

参考代码:

#include <stdio.h>

#include <string.h>

void integer_move();

int main()

{

    integer_move();

    return 0;

}


void integer_move()

{

    int num_number = 0, move_number = 0;

    while(num_number <= 0)

    {

         scanf("%d", &num_number);

    }

    int arr[num_number];

    int temp = 0,temp1 = 0;

    memset(arr, 0, sizeof(arr));  // 使用memset进行初始化

    // 这个错误发生在C语言中,因为可变长度数组(Variable-Length Arrays, VLAs)

    // 不能使用 {0} 进行初始化。在标准C中,可变长度数组在声明时不能被初始化

    //     使用 memset() 函数在声明后对数组进行初始化

    // 或者使用循环将所有元素设置为零

    // 考虑添加输入验证以提高程序健壮性

    for (int i = 0; i < num_number; i++)

    {

        scanf("%d", &arr[i]);

    }

    scanf("%d", &move_number);

    if(move_number > num_number)

    {

        move_number = move_number % num_number;

    }

    for(int j = 0; j < move_number; j++)

    {

        int last = arr[num_number - 1];  // 保存最后一个元素

        for(int i = num_number - 1; i > 0; i--)

        {


                printf("before move:");

                // for(int j = 0; j < num_number; j++)

                // {

                //     printf("%d ", arr[j]);

                // }

                // *(arr + i) = *(arr + i - 1);

                printf("after move:");

                // for(int j = 0; j < num_number; j++)

                // {

                //     printf("%d ", arr[j]);

                // }

                // printf("\n");

        }

        *arr = last;

    }  

    for(int i = 0; i < num_number; i++)

    {

        printf("%d ", arr[i]);

    }

}





// //方法2

// #include <stdio.h>

// #include <string.h>

// void integer_move();

// int main()

// {

//     integer_move();

//     return 0;

// }


// void integer_move()

// {

//     int num_number = 0, move_number = 0;

//     while(num_number <= 0)

//     {

//          scanf("%d", &num_number);

//     }

//     int arr[num_number];

//     int temp = 0,temp1 = 0;

//     memset(arr, 0, sizeof(arr));  // 使用memset进行初始化

//     // 这个错误发生在C语言中,因为可变长度数组(Variable-Length Arrays, VLAs)

//     // 不能使用 {0} 进行初始化。在标准C中,可变长度数组在声明时不能被初始化

//     //     使用 memset() 函数在声明后对数组进行初始化

//     // 或者使用循环将所有元素设置为零

//     // 考虑添加输入验证以提高程序健壮性

//     for (int i = 0; i < num_number; i++)

//     {

//         scanf("%d", &arr[i]);

//     }

//     scanf("%d", &move_number);

//     if(move_number > num_number)

//     {

//         move_number = move_number % num_number;

//     }

//     for(int j = 0; j < move_number; j++)

//     {

//         for(int i = 0; i < num_number - 1; i++)

//         {


//                 // printf("before move:");

//                 // for(int j = 0; j < num_number; j++)

//                 // {

//                 //     printf("%d ", arr[j]);

//                 // }

//                 temp = *(arr + i);

//                 *(arr + i) = *(arr + num_number - 1);

//                 *(arr + num_number - 1) = temp;

//                 // printf("after move:");

//                 // for(int j = 0; j < num_number; j++)

//                 // {

//                 //     printf("%d ", arr[j]);

//                 // }

//                 // printf("\n");

//         }

//     }  

//     for(int i = 0; i < num_number; i++)

//     {

//         printf("%d ", arr[i]);

//     }

// }


点赞(1)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论