PTA数组元素循环右移

!!!所有方法和代码均为复制粘贴,仅作自己整理的题解!!!
题目:https://pintia.cn/problem-sets/17/problems/262
方法一:
直接每次向右移动一个,一共N次, 要移动M位, 就移动M次 共NM次。

#include<bits/stdc++.h>
using namespace std;
int main()
{
 int n,m;
 cin>>n>>m;
 int a[n];
 for(int i=0;i<n;i++)//输入数组元素
  cin>>a[i];
 for(int j=0;j<m;j++)
 {
  int t;
  t=a[n-1];//保存最后一位数字
  for(int k=n-2;k>=0;k--)//数组中的元素右移一位
  {
   a[k+1]=a[k];
  }
  a[0]=t;//把最后一位数字放在第一位
 }
 for(int ii=0;ii<n;ii++)
 {
  cout<<a[ii];
  if(ii!=n-1)//最后一个数字没有空格
  {
   printf(" ");
  }
 }
 return 0;
}

方法二:
将数组分成两部分, 设后面M位为数组b, 前面N-M位为数组a, 那么数组的组成就是ab.
原始数组是ab, 我的目的是将这个数组变成ba
第一步:将整个长度为N的数组倒置得到 b-1a-1 .
第二步:将 b-1 数组和 a-1 数组分别倒置, 得到 ba数组.

//该函数实现将两个变量互换 
void Swap(int *a, int *b)
{
    //得到中间变量 
    *a = *a ^ *b;
    //b变量获取到a的值 
    *b = *b ^ *a;
    //a变量通过中间变量获取到当时b的值
    *a = *a ^ *b; 
}

void moveRight(int Arr[], int N, int M)
{
    int i, j;
    //转置所有的元素 
    for(i=N-1, j=0; j<i; i--, j++)
        Swap(&Arr[i], &Arr[j]);  
    //转置前面M个数据
    for(i=M-1, j=0; j<i; i--, j++)
        Swap(&Arr[i], &Arr[j]); 
    //转置后面面N-M个数据
    for(i=N-1, j=N-M-1; j<i; i--, j++)
        Swap(&Arr[i], &Arr[j]); 
}

在这里插入图片描述
方法三:控制输出格式

#include<bits/stdc++.h>
using namespace std;
int main()
{
 int n,m;
 cin>>n>>m;
 int a[n];
 for(int i=0;i<n;i++)
 cin>>a[i];
 m=m%n;//存在m>n的情况,要排除掉 2%5的结果是商0余2
 for(int j=n-m;j<=n-1;j++)//先输出第n-m个到最后一个
 cout<<a[j]<<" ";
 for(int k=0;k<n-m;k++)//再从一个输出到n-m-1个
 {
  cout<<a[k];
  if(k!=n-m-1) printf(" ");
 }
 return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值