https://pintia.cn/problem-sets/994805260223102976/problems/994805316250615808
测试点1 2 3
1、2:m大于n,需要m%=n;
3:m是n的整数倍,如0,1倍、2倍等,此时如果先输出a[n-m]会越界,所以最好是先输出“数+空格”,最后补一个数,这样在一开始会有for的边界限制
思路1
先打印后m个 再打印剩下的
#include <stdio.h>
int main()
{
int n,m;
scanf("%d %d",&n,&m);
m%=n;
int a[n]={0};
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-1; ++i)
printf("%d ",a[i]);
printf("%d",a[n-m-1]);
}
思路2
原地逆序 先逆置前n-m个 再逆置后m个 最后整体逆置
#include <stdio.h>
#define swap(a,b) { int temp; temp=a; a=b; b=temp;}
void reverse(int *a,int left,int right)//*(int(*)[6])a
{
for(int i=0; i<(right-left+1)/2; i++)
swap(a[left+i],a[right-i]);
}
int main()
{
int i,n,m;
scanf("%d %d",&n,&m);
m=m%n;//不一定输入的m一定小于n
int a[n];
for(i=0; i<n; i++)
scanf("%d",&a[i]);;
reverse(a,0,n-m-1);
reverse(a,n-m,n-1);
reverse(a,0,n-1);
for(i=0; i<n; i++){
printf("%d",a[i]);
if(i<n-1) printf(" ");
}
}