我是靠谱客的博主 耍酷彩虹,最近开发中收集的这篇文章主要介绍C语言PAT刷题 - 1008 数组元素循环右移问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

作者的话:若有朋友复制代码去PAT试着运行遇到问题的:
1.可能是格式问题,可以先把从本站复制的代码粘贴到记事本,再把记事本里的代码复制,然后粘贴到PAT的代码区,提交本题回答,应该就可以了;
2.可能是注释原因,PAT有时候检测到注释会编译错误,所以可以先把注释删了,再进行提交回答。
3.可能是作者当初根据题目写出来的代码仍存在一些疏漏,而恰好当时的测试机制没那么完善,没检测出问题。后面测试机制有所更新,故出现问题,若有相关需要的可以评论区留言或私信作者,我看到的话会去再查一下疏漏之处,然后更新文章。

一、题目描述
一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0​A1​⋯AN−1​)变换为(AN−M​⋯AN−1​A0​A1​⋯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源程序框架

#include <stdio.h>
int main()
{
return 0;
}

1.定义需要的变量(实际解题时是先定义认为需要用到的变量,后面遇到问题需要新定义变量时再回到上头来定义新的变量),从键盘接收两个正整数分别存入变量n和m中(n表示数组元素个数,m表示右移m个位置);

	int 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])。

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

3.实现右移一个位置:把arr【n-1】(即第n个数)赋值给临时变量temp,然后arr[n-2]赋值给arr[n-1],同理,将前面的所有元素都依次赋值给后一个元素,最后再把temp赋值给arr[0],整个数组向右移动一个位置的代码就顺利完成了。


temp = arr[n - 1];
for (i = n - 2; i >= 0; i--)
{
arr[i + 1] = arr[i];
}
arr[0] = temp;

4.以3作为内层循环,在3的外面嵌套一个循环,控制右移的步数,每一轮循环都将运转3的整个循环一次,完成数组右移一个位置。只要进行m轮外层循环,就实现了数组右移m个位置。

	for (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个元素,并设置判断语句进行判断,除了最后一个元素后面没空格,前面每个元素后面都有空格。

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

四、全部代码

#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刷题 - 1008 数组元素循环右移问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部