• 【C语言经典100例题-68】有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数


    方法一

            将原数组拆成两部分,前面n-m个数和后面m个数。首先将前面n-m个数逆序,然后将后面的m个数逆序。最后将整个数组逆序即可。

    1. #include
    2. void reverse(int arr[], int start, int end)
    3. {
    4. for (int i = start, j = end; i <= (start + end) / 2; i++, j--)
    5. {
    6. int temp = arr[i];
    7. arr[i] = arr[j];
    8. arr[j] = temp;
    9. }
    10. }
    11. void rotate(int arr[], int n, int m)
    12. {
    13. reverse(arr, 0, n - m - 1); // reverse first n-m elements
    14. reverse(arr, n - m, n - 1); // reverse last m elements
    15. reverse(arr, 0, n - 1); // reverse the whole array
    16. }
    17. int main()
    18. {
    19. int n, m;
    20. printf("请输入整数的个数n和向后移动的位置m:\n");
    21. scanf_s("%d %d", &n, &m);
    22. int arr[] = { 0 };
    23. printf("请输入%d个整数:\n", n);
    24. for (int i = 0; i < n; i++) {
    25. scanf_s("%d", &arr[i]);
    26. }
    27. rotate(arr, n, m);
    28. printf("反转后的数组为: \n");
    29. for (int i = 0; i < n; i++)
    30. printf("%d ", arr[i]);
    31. return 0;
    32. }

            首先定义了一个 reverse 函数,用来逆序数组的一部分,它的参数为数组,起始下标和结束下标。

            然后定义了一个 rotate 函数,用来旋转数组。它的参数为数组、数组的长度和旋转的数量。该函数先将前面的 n-m 个元素逆序,然后将后面的 m 个元素逆序。最后将整个数组逆序。

            在 main 函数中,定义了一个整数数组 arr,并将其长度和旋转数量分别设置为 7 和 2。然后调用 rotate 函数对数组进行旋转。最后打印出旋转后的数组。

    方法二 

            函数shift接受一个整型数组arr、数组长度n和向后移动的位置m,先将后面的m个数保存到临时数组temp中,然后将前面n-m个数向后移动m个位置,最后将临时数组temp中的m个数放到数组arr的前面。main函数中读入整数个数和数组元素,并调用shift函数移动数组。 

    1. #include
    2. void shift(int arr[], int n, int m) {
    3. int temp[m];
    4. for (int i = n - m; i < n; i++) {
    5. temp[i - n + m] = arr[i];
    6. }
    7. for (int i = n - m - 1; i >= 0; i--) {
    8. arr[i + m] = arr[i];
    9. }
    10. for (int i = 0; i < m; i++) {
    11. arr[i] = temp[i];
    12. }
    13. }
    14. int main() {
    15. int n, m;
    16. printf("请输入整数个数n和向后移动的位置m:");
    17. scanf("%d%d", &n, &m);
    18. int arr[n];
    19. printf("请输入%d个整数:", n);
    20. for (int i = 0; i < n; i++) {
    21. scanf("%d", &arr[i]);
    22. }
    23. shift(arr, n, m);
    24. printf("移动后的数组为:");
    25. for (int i = 0; i < n; i++) {
    26. printf("%d ", arr[i]);
    27. }
    28. printf("\n");
    29. return 0;
    30. }

  • 相关阅读:
    Axure9 基本操作(一)
    RocketMQ 消息重复消费
    Flink SQL --- 窗口聚合
    [附源码]计算机毕业设计JAVA购买车票系统
    STM32HAL库单ADC+DMA学习及测试记录
    推荐一款非常好用的API接口测试工具EoLink
    【机器学习】聚类算法中的 K-means 算法及其原理
    从零开始利用MATLAB进行FPGA设计(七)用ADC采集信号教程2
    【工具类】非 sudo 运行 docker
    latex技巧
  • 原文地址:https://blog.csdn.net/qq_52442214/article/details/133514651