问题:
一个数组A中存有N(N>0)个数, 在不允许使用任何另外数组的前提下, 将每个整数循环右移M(M>0)位, 考虑移动数据的次数尽量少, 要如何设计移动方法?
0<=n<=100,m>=0
末尾不能有多余空格
把自己最先想到但是算法错误的那个更正之后放第二块里面了
#include<stdio.h>
//最先想到的
// m- m m+ n
// 全部后移m位,把最后m个再输回来
// n=5;m=2;
// 1 2 3 4 5
//a[0]=a[3]
int main() {
int n,m;
int fig[210]={0};
scanf("%d",&n);
scanf("%d",&m);
for(int i=0;i<n;i++){
// scanf("%d",fig+i);//多用一些自己比较模糊的知识点 // fig+i指针输入,不支持改变他的值
scanf("%d",&fig[i]);
}
// 错的,待盘
/* for(int i=n-1;n>-1;i--){
fig[i+m]=fig[i];//????????????/
}
for(int i=0;i<m;i++){
fig[i]=fig[n-m+i];
}
for(int i=0;i<n;i++){
printf("%d",fig[i]);
if(i==m+n) printf("\n");
else printf(" ");
}*/
// 笔记算法
m%=n;
//因为题目条件并没有m<=n;
for(int i=n-m;i<n;i++) printf("%d ",fig[i]);
for(int i=0;i<n-m;i++) {
if(i==n-1) printf("%d\n",fig[i]);
else printf("%d ",fig[i]);}
// 计数,count<n 是否输入“ ”,********
return 0;
}
#include<stdio.h>
//最先想到的
// m- m m+ n
// 全部后移m位,把最后m个再输回来
// n=5;m=2;
// 1 2 3 4 5
//a[0]=a[3]
int main() {
int n,m;
int fig[210]={0};
scanf("%d",&n);
scanf("%d",&m);
for(int i=0;i<n;i++){
scanf("%d",&fig[i]);
}
// for(int i=n-1;n>-1;i--){//是i>-1啊宝!!!!!!天啦噜******
for(int i=n-1;i>-1;i--){
fig[i+m]=fig[i];
}
for(int i=0;i<m;i++){
// fig[i]=fig[n-m+i];//原来位置的数字已经挪位了,这里不行,再加个m ,就是n+i
fig[i]=fig[n+i];
}
for(int i=0;i<n;i++){
printf("%d",fig[i]);
if(i==m+n) printf("\n");
else printf(" ");
}
return 0;
}