C++入门 PAT真题 B1008 数组元素循环右移问题

C++入门 PAT真题 B1008 数组元素循环右移问题
逛了猫咖!喵子真可爱!!!想养!问题描述

一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A​0​​A​1​​⋯A​N−1​​)变换为(A​N−M​​⋯A​N−1​​A​0​​A​1​​⋯A​N−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;
}

以上代码仅供参考。若有疑问请先看代码注释,看思路分析。欢迎留言、私信版主交流问题

结果截图

在这里插入图片描述在这里插入图片描述如需转载,请联系版主。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值