初学一维数组中——关于移位的应用

☆一维数组中的移位问题☆

一.例题引入

输入N个整数,输出由这些整数组成的n行矩阵。

输入格式:
第一行输入一个正整数N(N<=20),表示后面要输入的整数个数。
下面依次输入N个整数。

输出格式:
以输入的整数为基础,输出有规律的N行数据。

输入样例:
在这里给出一组输入。例如:

5
3 6 2 5 8
输出样例:
在这里给出相应的输出。例如:

3 6 2 5 8
8 3 6 2 5
5 8 3 6 2
2 5 8 3 6
6 2 5 8 3

二.分析思路

  1. 第一步显然是输入个数,输入一维数组

  2. 第二部按题目要求交换位置

  3. 确定输出次数

    展开来说,第一步还是比较轻松的

include <stdio.h>
int main()
{
    int n = 0;
    int num[100];
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &num[i]);
    }

           //第一步结束
  return 0;
}

但是先别急,看题目要求输出的第一行就是原来的数组顺序,咱们先把这一步给输出出来(注意的是,最后一个数字输出后面是没有空格的,所有用个条件语句判断一下)

     //输出第一行(原有的数组排序)
    for (int i = 0; i < n; i++)
    {
        if (i == n - 1)
            printf("%d", num[i]);
        else
            printf("%d ", num[i]);
            printf("\n");
    }

接下来第二部步,确定完数组,后面就怎么样去交换,根据题目要求,是把最后一位放到第一位,然后原有的第一位到倒数第二位都往后一个位置。
首先操作最后一个数,共有n个数,所以数组最后一位是n-1,暂时贮存在temp中,想不到为什么要去储存先往后;


int temp = num[n - 1];
       

按刚开始的思路,接下来要去把每一项都后移一位,过程如下:

    for (int i = n - 1; i >= 0; i--)
       {
        num[i] = num[i - 1];
       }

然后,要把原来的最后一位放到第一位,但是现在的最后一位是原来的倒数第二位,如果按下面的写法肯定是不对的:

    num[0] = num[i-1];

所以,刚才的temp是有作用了,在替换位置之前,已经将原有的最后一位放到temp里面暂存了。

    num[0] = temp;

然后跟输出第一行一样输出

    for (int j = 0; j < n; j++)
    {
        if (j == n - 1)
            printf("%d", num[j]);
        else
            printf("%d ", num[j]);
    }
    printf("\n");

第三步,看题目要求的N的次数,因为第一次已经提前输出,所以只需N-1次,把刚才的第二步给放到这个大循环里面吗就可以了,整体过程如下:

#include <stdio.h>

int main()
{
    //第一步
    int n = 0;
    int num[100];
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &num[i]);
    }

    for (int i = 0; i < n; i++)//输出第一行
    {
        if (i == n - 1)
            printf("%d", num[i]);
        else
            printf("%d ", num[i]);
    }
    printf("\n");
    for(int i=0;i<n-1;i++)//第三步需要循环剩下的次数
    {
       //第二步
    
       int temp = num[n - 1];

    for (int i = n - 1; i >= 0; i--)
       {
        num[i] = num[i - 1];
       }
    num[0] = temp;
    for (int j = 0; j < n; j++)
    {
        if (j == n - 1)
            printf("%d", num[j]);
        else
            printf("%d ", num[j]);
    }
    printf("\n");
    }
    return 0;
}

总结 (1)

本次解决这个题目的重要步骤就是用i–的思路,在代码中表现的是这一段:

       int temp = num[n - 1];

    for (int i = n - 1; i >= 0; i--)
       {
        num[i] = num[i - 1];
       }
      num[0] = temp;

四.进一步探究

例题·移多位

有n个整数,使其最后m个数变成最前面的m个数,其他各数顺序向后移m(m < n < 100)个位置。

输入格式:
输入数据有2行,第一行的第一个数为n,后面是n个整数,第二行整数m。

输出格式:
按先后顺序输出n个整数。

输入样例:
5 1 2 3 4 5
2
输出样例:
4 5 1 2 3

1.思路
  1. 先输入需要输入的个数
  2. 按题目要求将最后两个数放到前面两位,每一位往后移两位
  3. 按要求输出
2.演示

先做第一步,这里就不过多解释

#include <stdio.h>

int main() {
    int num[100];
    int n, m;

    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &num[i]);
    }
    scanf("%d", &m);

    return 0;
}

按照第一个题的思路,需要把最后的数字放到temp临时储存,只不过这里是后m个数

    int temp[100];
    for (int i = 0; i < m; i++) 
    {
        temp[i] = num[n - m + i];
    }

    for (int i = n - 1; i >= m; i--)
     {
        num[i] = num[i - m];
    }

    for (int i = 0; i < m; i++)
     {
        num[i] = temp[i];
    }

输出,还是注意最后一个数字后面没有空格

    for (int i = 0; i < n; i++) {
        if (i == n - 1) {
            printf("%d\n", num[i]);
        } else {
            printf("%d ", num[i]);
        }

下面是整体的思路:

#include <stdio.h>

int main() 
{
    int num[100];
    int n, m;
//1
    scanf("%d", &n);
    for (int i = 0; i < n; i++) 
    {
        scanf("%d", &num[i]);
    }
    scanf("%d", &m);
//2
    int temp[100];
    for (int i = 0; i < m; i++) 
    {
        temp[i] = num[n - m + i];
    }
//3
    for (int i = n - 1; i >= m; i--) 
    {
        num[i] = num[i - m];
    }
//4
    for (int i = 0; i < m; i++) 
    {
        num[i] = temp[i];
    }
//5
    for (int i = 0; i < n; i++) 
    {
        if (i == n - 1) 
        {
            printf("%d\n", num[i]);
        } else {
            printf("%d ", num[i]);
        }
    }

    return 0;
}

总结(2)

根据上面两个例题,可以将移位的重要步骤分为:

  1. 储存原有数据
  2. 将最后的一位或多位储存在临时变量中
  3. 将数组整理后移(用最后一位为for循环开始,然后i–)
  4. 将临时储存的数字放在前面
  5. 输出(注意最后一位没有空格)
本次文章是本人第一次书写,如有不严谨不妥当请多多包含/指教
posted @ 2024-10-17 15:38  dearbi  阅读(0)  评论(0)    收藏  举报  来源