!!!所有方法和代碼均爲複製粘貼,僅作自己整理的題解!!!
題目: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;
}