数组旋转的C程序?

什么是数组旋转

数组旋转是指将数组中的元素按照一定规律进行移动的操作,通常包括两种操作:

左旋转

左旋转即将数组元素向左移动k个位置。比如,将数组[1,2,3,4,5,6,7]左旋转3个位置后得到[4,5,6,7,1,2,3]。

右旋转

右旋转即将数组元素向右移动k个位置。比如,将数组[1,2,3,4,5,6,7]右旋转3个位置后得到[5,6,7,1,2,3,4]。

数组旋转的C程序

下面是一个数组左旋转的C程序:

#include<stdio.h>

void leftRotate(int arr[], int d, int n)

{

int i, j, temp;

for(i = 0; i < gcd(d, n); i++)

{

temp = arr[i];

j = i;

while(1){

int k = j + d;

if(k >= n)

k = k - n;

if(k == i)

break;

arr[j] = arr[k];

j = k;

}

arr[j] = temp;

}

}

int gcd(int a,int b)

{

if(b==0)

return a;

else

return gcd(b,a%b);

}

int main()

{

int arr[] = {1, 2, 3, 4, 5, 6, 7};

int n = sizeof(arr) / sizeof(arr[0]);

int d = 2;

leftRotate(arr, d, n);

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

printf("%d ", arr[i]);

return 0;

}

程序解释

这个C程序实现了一个数组左旋转的功能,采用的是辗转相除法求最大公因数。下面来解释一下程序的细节:

leftRotate函数

这个函数实现了数组左旋转的功能,需要传入三个参数:

arr: 需要进行旋转的数组

d: 旋转的位数

n: 数组的长度

函数首先会求出最大公因数g,然后通过外部循环遍历g个数,内部循环进行交换。

gcd函数

这个函数实现了求最大公因数的功能。

a: 第一个数

b: 第二个数

函数采用递归的方式实现辗转相除法,当第二个数为0时,返回第一个数,否则返回gcd(b, a%b)。

程序输出

上述C程序的输出结果是:

3 4 5 6 7 1 2 

数组右旋转的C程序

下面是一个数组右旋转的C程序:

#include<stdio.h>

void rightRotate(int arr[], int d, int n)

{

int temp[d], i, j;

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

temp[i] = arr[n-d+i];

for(i = n-1; i >= d; i--)

arr[i] = arr[i-d];

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

arr[i] = temp[i];

}

int main()

{

int arr[] = {1, 2, 3, 4, 5, 6, 7};

int n = sizeof(arr) / sizeof(arr[0]);

int d = 2;

rightRotate(arr, d, n);

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

printf("%d ", arr[i]);

return 0;

}

程序解释

这个C程序实现了一个数组右旋转的功能,采用的是暴力方法,将要右移的d个数暂存到临时数组里面,再把原数组后面的n-d个数往后挪d个位置,最后再把临时数组中的d个数拷贝到原数组前d个位置。

rightRotate函数

这个函数实现了数组右旋转的功能,需要传入三个参数:

arr: 需要进行旋转的数组

d: 旋转的位数

n: 数组的长度

首先将要右移的d个数暂存到临时数组中,然后把原数组后面的n-d个数往后挪d个位置,最后再把临时数组中的d个数拷贝到原数组前d个位置。

程序输出

上述C程序的输出结果是:

6 7 1 2 3 4 5 

总结

数组旋转是一个常见的操作,在开发中经常会遇到需求。本文介绍了两种数组旋转的实现方式,左旋转使用了辗转相除法求最大公因数,右旋转采用了暴力方法。两种方法均可实现数组旋转的功能,读者可以根据实际需求选择不同的方法。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签