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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章