【PTA】 陣列元素迴圈右移問題
阿新 • • 發佈:2019-02-03
7-52 陣列元素迴圈右移問題(20 分)
一個數組AAA中存有N(>0)個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移M(≥0)個位置,即將AAA中的資料由(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.最基本的每次都把最後一位元素拿出來,然後都把陣列元素右移一位,在將最後一位放在第一位的位置熵,重複m次。
2.控制輸出格式
還有其他更好的做法,目前才疏學淺,之後在更新。
3.第三種做法,看程式碼。一定要特別注意m>n的情況。
程式碼:
1.
#include <stdio.h> int main(int argc,const char *argv[]) { int n,m; if(scanf("%d %d",&n,&m)){}; int a[n]; for(int i=0;i<n;i++)//輸入陣列元素 { if(scanf("%d",&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++) { printf("%d",a[ii]); if(ii!=n-1)//最後一個數字沒有空格 { printf(" "); } } return 0; }
2.
include <stdio.h> int main(int argc,const char *argv[]) { int n,m; if(scanf("%d %d",&n,&m)){}; int a[n]; for(int i=0;i<n;i++) { if(scanf("%d",&a[i])){}; } m=m%n;//存在m>n的情況,要排除掉 for(int j=n-m;j<=n-1;j++)//先輸出第n-m個到最後一個 { printf("%d ",a[j]); } for(int k=0;k<n-m;k++)//在從一個輸出到n-m-1個 { printf("%d",a[k]); if(k!=n-m-1) { printf(" "); } } return 0; }
3.
#include <iostream>
using namespace std;
int *inverse(int a[],int x,int y);
int main(int argc,const char*argv[])
{
int n,m;
cin>>n>>m;
int a[n];
int *p=a;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
inverse(a,0,n-m%n-1);
inverse(a,n-m%n,n-1);
inverse(a,0,n-1);
for(int j=0;j<n;j++)
{
cout<<a[j];
if(j!=n-1){
cout<<" ";
}
}
return 0;
}
int *inverse(int a[],int x,int y)
{
int *q=a;
int t;
for(;x<=y;x++,y--)
{
t=a[y];
a[y]=a[x];
a[x]=t;
}
return q;
}