循环右移只要做三次逆序 *** 作就行了,代码如下,请采纳。
看注释部分,认真想一下,不懂可追问
#include <stdioh>//将数组a的第left位到第right位之间的元素逆序
void reverse(int a[],int left,int right){
for(int i=0;i<=(right-left)/2;i++){
int tmp = a[left+i];
a[left+i] = a[right-i];
a[right-i] = tmp;
}
}
int main()
{
int a[100];
int n,m,i;
printf("输入数组长度:");
scanf("%d",&n);
printf("输入各数组元素:");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
printf("输入右移位数:");
scanf("%d",&m);
//1将整个数组逆序
reverse(a,0,n-1);
//2将前m位逆序
reverse(a,0,m-1);
//3将剩下的后半部分逆序
reverse(a,m,n-1);
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}首先要知道数组的长度是有限的并且在程序编译之前就要给出确定值。在程序运行的时候
我们要把数组内的数据集体右移,那么数组最后一个数据是必要移动到数组的第一个位置,因为原来第一个位置的数据已经移动到第二个位置了,我们还要明确数组的下标计数是从0开始的,也就是说你定义长度为15的数组
其下标是0~14
所以是先把n-1下标位置的数据拿出来(t=)
再整体右移,(因为n-1位置被拿出来了不用担心后面会覆盖掉它,你在循环处限制了范围也不用担心n-1位置的数据会被移动到n处),当整体右移完毕后
用t覆盖第一个位置即可完成题目要求
#include<stdioh>
int main()
{char s[]="123456789",p1,p2,a,b;
for(p1=s;p1;p1++);
p2=--p1;
b=p1;
p2=p1-1;
a=(p2--);
for(;p1>=s;)p1--=p2--;
s[0]=a;
s[1]=b;
printf("%s\n",s);
return 0;
}
首先你定义的数组要足够大,即要保证能完整的保存右移后的数据。程序。此函数不能实现任意个数数据的右移,要实现任意个数的数据右移要用到malloc和realloc库函数实现动态定义数组。
#include<stdioh>
void main()
{
int i,n,a[20]={1,2,3 4,5,6,7,8,9,10};/最大右移量为10/
printf("input right shift\n");
scanf("%d",&n);
for(i=9;i>=0;i--)
{
a[i+n]=a[i];
a[i]=0;/要消除a[0]--a[9]的值吗?可以置其为0表示消除/
}
输出右移后的语句。
}#include "stdioh"
/ 将数组arr循环右移size位 /
void CMR(int p, int len, int size)
{
int i, j;
int temp;
if(size<1 || size>=len)
return;
for(i=0,j=len-size-1; i<j; i++,j--)
{
temp = (p+i);
(p+i) = (p+j);
(p+j) = temp;
}
for(i=len-size,j=len-1; i<j; i++,j--)
{
temp = (p+i);
(p+i) = (p+j);
(p+j) = temp;
}
for(i=0; i<len/2; i++)
{
temp = (p+i);
(p+i) = (p+len-1-i);
(p+len-1-i); = temp;
}
}
void main()
{
int i;
int arr[] = {1,2,3,4,5};
int len = 5;
int size = 1;
printf("before move : ");
for(i=0; i<len; i++)
printf("%d ", arr[i]);
printf("\n");
CMR(arr, len, size);
printf("after moved : ");
for(i=0; i<len; i++)
printf("%d ", arr[i]);
printf("\n");
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)