将一维数组a中的元素循环右移3次,如a[ ]={1,2,3,4,5},循环右移3次后a[ ]={3,4,5,1,2},如何编写程序?
- 提问者网友:且恨且铭记
- 2021-08-13 00:19
- 五星知识达人网友:迷人又混蛋
- 2021-08-13 01:31
以你的例子写了个. 如果需要修改请追问.
#include <stdio.h>
void main()
{
int a[]={1,2,3,4,5}; //整形数组在定义时就必须确定长度.
int i,j,t,n=3; //n是右移的次数.
while(n--) //每次都将最后一个元素先拿出来.然后把前面的依次后移.
{
t=a[4];
for(j=4;j;j--) //数组元素依次后移.
{
a[j]=a[j-1];
}
a[j]=t; //最后把之前拿出来的最后一个元素放到数组的首位中.
}
for(i=0;i<5;i++) //输出
printf("%d ",a[i]);
}
运行时截图:
- 1楼网友:第四晚心情
- 2021-08-13 01:54
//最高效的右移算法!! //这个是递归的写法 //author:tengzhao201 QQ:715572192 //time:2010-4-24 //时间复杂度为O(n),空间复杂度O(1),交换点在中间时比逆序法快一倍!!! void TZshift1(long a[],long N,long K) { K=K%N;
if(0==K)return;
long temp,qq,pp=0; pp=0;qq=K; for(long i=0;i<N-K;i++,pp++,qq++) { //swap(a[i%K],a[i+K]);问题的关键在于找到原来的第i个元素现在在哪里,通过观察可以发现在a[i%K]的位置上,下面的代码实现了a[i%K]和a[i+K]的互换 if(K==pp)pp=0; temp=a[pp]; a[pp]=a[qq]; a[qq]=temp; }
TZshift1(a,K,K-pp); }
//最高效的右移算法!! //非递归的写法 //author:tengzhao201 QQ:715572192 //time:2010-4-24 //时间复杂度为O(n),空间复杂度O(1),交换点在中间时比逆序法快一倍!!! void TZshift0(long a[],long N,long K) { K=K%N; if(0==K) return;
//long count=0; long temp,qq,pp=0;
while(K>0) { pp=0;qq=K; for(long i=0;i<N-K;i++,pp++,qq++) { //swap(a[i%K],a[i+K]);问题的关键在于找到原来的第i个元素现在在哪里,通过观察可以发现在a[i%K]的位置上,下面的代码实现了a[i%K]和a[i+K]的互换
if(K==pp)pp=0; temp=a[pp]; a[pp]=a[qq]; a[qq]=temp; //count+=2; } N=K; if(0==pp) return; K-=pp; //TZshift(a,K,K-pp); } //cout<<"In tatal,has used "<<count<<" steps."<<endl; }