作者的话:若有朋友复制代码去PAT试着运行遇到问题的:
1.可能是格式问题,可以先把从本站复制的代码粘贴到记事本,再把记事本里的代码复制,然后粘贴到PAT的代码区,提交本题回答,应该就可以了;
2.可能是注释原因,PAT有时候检测到注释会编译错误,所以可以先把注释删了,再进行提交回答。
3.可能是作者当初根据题目写出来的代码仍存在一些疏漏,而恰好当时的测试机制没那么完善,没检测出问题。后面测试机制有所更新,故出现问题,若有相关需要的可以评论区留言或私信作者,我看到的话会去再查一下疏漏之处,然后更新文章。
一、题目描述
一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−M−1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:
每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。
输出格式:
在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4
二、解题思路
读题:
我们需要设计一个程序来将一个数组的各个元素右移n个位置,右边超出的元素补到左边。如数组a[3]向右移动两位,原本的顺序是a[0]a[1]a[2],移动之后是a[1]a[2]a[0]。当然,移动的是各元素的值,本身数组下标是没变的。
思路:
希望实现右移n个位置,可以先将问题简化为右移一个位置,实现了这个,然后利用循环便可以做到右移n个位置了。
1.定义需要的变量(实际解题时是先定义认为需要用到的变量,后面遇到问题需要新定义变量时再回到上头来定义新的变量),从键盘接收两个正整数分别存入变量n和m中(n表示数组元素个数,m表示右移m个位置);
2.设置循环接收n个整数存入数组arr中(第一个数存入arr[0],第二个存入arr[1],…第n个存入arr[n-1])。
3.实现右移一个位置:把arr【n-1】(即第n个数)赋值给临时变量temp,然后arr[n-2]赋值给arr[n-1],同理,将前面的所有元素都依次赋值给后一个元素,最后再把temp赋值给arr[0],整个数组向右移动一个位置的代码就顺利完成了。
4.以3作为内层循环,在3的外面嵌套一个循环,控制右移的步数,每一轮循环都将运转3的整个循环一次,完成数组右移一个位置。只要进行m轮外层循环,就实现了数组右移m个位置。
5.设置循环打印数组前n个元素,并设置判断语句进行判断,除了最后一个元素后面没空格,前面每个元素后面都有空格。
三、具体实现
0.标准C源程序框架
1
2
3
4
5
6#include <stdio.h> int main() { return 0; }
1.定义需要的变量(实际解题时是先定义认为需要用到的变量,后面遇到问题需要新定义变量时再回到上头来定义新的变量),从键盘接收两个正整数分别存入变量n和m中(n表示数组元素个数,m表示右移m个位置);
1
2
3
4
5
6
7
8int n = 0; int m = 0; int arr[100] = { 0 }; int i = 0; int j = 0; int temp = 0; scanf("%d%d", &n,&m);
2.设置循环接收n个整数存入数组arr中(第一个数存入arr[0],第二个存入arr[1],…第n个存入arr[n-1])。
1
2
3
4
5for (i=0;i<n;i++) { scanf("%d",&arr[i]); }
3.实现右移一个位置:把arr【n-1】(即第n个数)赋值给临时变量temp,然后arr[n-2]赋值给arr[n-1],同理,将前面的所有元素都依次赋值给后一个元素,最后再把temp赋值给arr[0],整个数组向右移动一个位置的代码就顺利完成了。
1
2
3
4
5
6
7
8temp = arr[n - 1]; for (i = n - 2; i >= 0; i--) { arr[i + 1] = arr[i]; } arr[0] = temp;
4.以3作为内层循环,在3的外面嵌套一个循环,控制右移的步数,每一轮循环都将运转3的整个循环一次,完成数组右移一个位置。只要进行m轮外层循环,就实现了数组右移m个位置。
1
2
3
4
5
6
7
8
9
10for (j = 0; j < m; j++) { temp = arr[n - 1]; for (i = n - 2; i >= 0; i--) { arr[i + 1] = arr[i]; } arr[0] = temp; }
5.设置循环打印数组前n个元素,并设置判断语句进行判断,除了最后一个元素后面没空格,前面每个元素后面都有空格。
1
2
3
4
5
6
7
8
9for (i = 0; i < n; i++) { printf("%d", arr[i]); if (i<n-1) { printf(" "); } }
四、全部代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37#include <stdio.h> int main() { int n = 0;//存储待接收的整数序列的元素个数 int m = 0;//存储右移的步数 int arr[100] = { 0 };//存储待接收的整数序列 int i = 0;//循环变量 int j = 0;//循环变量,表示循环中已经右移的步数 int temp = 0;//临时变量,用于帮助各元素数据的移动 scanf("%d%d", &n,&m); for (i=0;i<n;i++) { scanf("%d",&arr[i]); } for (j = 0; j < m; j++) //每一轮循环实现右移一个位置,总共进行m轮循环,即右移m个位置 { //实现右移一个位置 temp = arr[n - 1]; for (i = n - 2; i >= 0; i--) { arr[i + 1] = arr[i]; } arr[0] = temp; } for (i = 0; i < n; i++)//设置循环打印数组前n个元素 { //并设置判断语句进行判断,除了最后一个元素后面没空格,前面每个元素后面都有空格 printf("%d", arr[i]); if (i<n-1) { printf(" "); } } return 0; }
最后
以上就是耍酷彩虹最近收集整理的关于C语言PAT刷题 - 1008 数组元素循环右移问题的全部内容,更多相关C语言PAT刷题内容请搜索靠谱客的其他文章。
发表评论 取消回复