當前位置:編程學習大全網 - 編程語言 - 編程 c++ 將數組 的元素右移m個位置,要壹步到位。

編程 c++ 將數組 的元素右移m個位置,要壹步到位。

壹次性完成移動的思想:由於數組的儲存方式,不能用交換數據來完成,想將a[0]移到a[3]即a[(0+3)%5],必須先將a[3]移到a[1],在這之前要將a[1]移到a[4],在這之前要將a[4]移到a[2],在這之前要將a[2]移到a[0],我們先將a[0]單獨儲存起來,這樣移動順序為a[2]到a[0],a[4]到a[2],a[1]到a[4],a[3]到a[1],最後將儲存的a[0]賦給a[3];a[(0+3)%5]可以用公式a[(i+m)%n]來表示,由此可以寫出程序

#include<stdio.h>

#define n 5

void main()

{

int a[n],i,t;

for(i=0;i<n;i++) a[i]=i+1;

printf("逆序前數組a[]=");

for(i=0;i<n;i++) printf("%4d",a[i]);

printf("\n");

i=0;

while(i<n-i-1)

{

t=a[i];a[i]=a[n-1-i];a[n-1-i]=t;i++;

}

printf("逆序後數組a[]=");

for(i=0;i<n;i++) printf("%4d",a[i]);

printf("\n");

//將數組a的元素右移m個位置,壹步到位

for(i=0;i<n;i++) a[i]=i+1;

int temp=a[0];//將a[0]儲存起來

int k=0;

int m;

printf("請輸入要向後移動的位數:");

scanf("%d",&m);

do

{

int b=0;

for(int j=0;j<n;j++)//尋找要移動到a[k]位置的數a[b]

{

if((j+m)%n==k)

{

b=j;

break;

}

}

a[k]=a[b];//將a[b]移動到a[k],第壹步時將a[2]移動到a[0]

k=b;//第壹步移動完成後k=0變為b=2以此類推

}while(k!=0);

a[(0+m)%n]=temp;

printf("右移後數組a[]=");

for(i=0;i<n;i++) printf("%4d",a[i]);

printf("\n");

//定義第二個數組b,將a中的元素直接放到b中合適的位置,全做好後,再把b拷貝回a。

for(i=0;i<n;i++) a[i]=i+1;

int b[n]={0};

for(i=0;i<n;i++)

{

b[(i+m)%n]=a[i];

}

for(i=0;i<n;i++)

{

a[i]=b[i];

}

printf("右移後數組a[]=");

for(i=0;i<n;i++) printf("%4d",a[i]);

printf("\n");

}

本程序數組數據移動法只能解決奇數元素個數的數組,偶數的數組不能完全實現,數組是偶數時情況太多,不如用新建數組相互拷貝的方法。

其實本題用遞歸要好壹點,不過那需要用到函數調用,這兒就不寫了

覺得好,望采納

  • 上一篇:矢量編程簡化五軸聯動加工中心加工工藝是什麽?
  • 下一篇:佩信集團榮獲2020阿裏巴巴&quot;年度最佳供應商&quot;大獎
  • copyright 2024編程學習大全網