1008 数组元素循环右移问题 (20分)
一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0、 A1、⋯AN−1 )变换为(AN−M、⋯AN−1、A0、A1、⋯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 位,将数组的每一位都挪动。用 t 保存多出来的一位。
#include<stdio.h>
int main()
{
int a[101];
int n;
int s = 0;
scanf("%d",&n);
int count;
scanf("%d",&count);
int i;
for(i = 0; i < n;i++)
{
scanf("%d",&a[i]);
}
int x;
x = n;
while(s != count) //将最后一位向右移动后,开始挪动每一位。
{
x = n-1;
int t = a[0];
a[0] = a[x];
for(int y = x;y > 1;y--)
{
a[y] = a[y-1];
}
a[1] = t; //最后将保存的第 0 位,放在第一位上
s++;
}
for(int i = 0; i< n;i++)
{
printf("%d",a[i]);
if(i != n-1)
{
printf(" ");
}
}
}
法2
输出挪动后出来的数,先求出要挪动的数 m = m%n,将后m个数先输出,再输出前n-m个数,即是挪动后要输出的数组。
#include<stdio.h>
int main()
{
int a[101];
int n,m;
scanf("%d",&n);
scanf("%d",&m);
m = m%n; //要真移动的次数
for(int i = 0;i < n;i++)
{
scanf("%d",&a[i]);
}
for(int i = n-m;i < n;i++) //输出后面 m 个数
{
printf("%d ",a[i]);
}
for(int i = 0;i < n-m;i++) //输出剩下的前面的数
{
printf("%d",a[i]);
if(i != n-m-1)
{
printf(" ");
}
}
return 0;
}