初学一维数组中——关于移位的应用
☆一维数组中的移位问题☆
一.例题引入
输入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
二.分析思路
-
第一步显然是输入个数,输入一维数组
-
第二部按题目要求交换位置
-
确定输出次数
展开来说,第一步还是比较轻松的
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.思路
- 先输入需要输入的个数
- 按题目要求将最后两个数放到前面两位,每一位往后移两位
- 按要求输出
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)
根据上面两个例题,可以将移位的重要步骤分为:
- 储存原有数据
- 将最后的一位或多位储存在临时变量中
- 将数组整理后移(用最后一位为for循环开始,然后i–)
- 将临时储存的数字放在前面
- 输出(注意最后一位没有空格)

浙公网安备 33010602011771号