C++入门 PAT真题 B1008 数组元素循环右移问题
C++入门 PAT真题 B1008 数组元素循环右移问题
问题描述
一个数组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
思路分析
(1)输入合法判断:
按照题目要求,需要对N、M输入的合法性进行判断。并且对不合法输入进行处理操作。
题目并没有对M限制不能大于N。所以对右移位的位数M应该是M%N,这样如果M>N,最后移位的取值也是正确的、有意义的。
(2)输入数据的存储:题目要求用一组数组来存储,所以就不要采用其他方法
(3)移位后数据的输出:按照题目要求,可以先输出N-M到N-1的数据,再输出0-N-M-1。
这里需要注意,如果要分开输出,那么使用两个for循环去控制输出是好操作、易理解的。
代码
#include<iostream>
#include <stdio.h>
using namespace std;
int main()
{
int num_in[100];
int i=0;
char c;
int N,M; //输入的N和M的
int count=0; //记录输出的数字的数目
cin>>N>>M;
if(N<0||N>100||M<0) //限制大小和错误处理
{
return 0;
}
M=M%N; //未限制M<N,移位只需要求余数
c=getchar(); //获取输入字符
while(i<N) //终止条件为数组中的数达到应有的存储数目
{
c=getchar(); //获取输入字符
if((c>='0'&&c<='9')||c=='-') //输入正整数、负整数
{
ungetc(c,stdin);
cin>> num_in[i++];
}
}
for(int j=N-M;j<N;j++) //输出N-M到N-1号
{
cout<<num_in[j];
count++;
if(count<N) cout<<' ';
}
for(int j=0;j<N-M;j++) //输出0号到N-M-1号
{
cout<<num_in[j];
count++;
if(count<N) cout<<' ';
}
return 0;
}
以上代码仅供参考。若有疑问请先看代码注释,看思路分析。欢迎留言、私信版主交流问题
结果截图
如需转载,请联系版主。