c语言数组旋转180度
时间: 2023-05-13 13:04:37 浏览: 179
以下是C语言数组旋转180度的代码:
```c
#include <stdio.h>
void reverse(int arr[], int start, int end) {
while (start < end) {
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
start++;
end--;
}
}
void rotate(int arr[], int n) {
reverse(arr, 0, n-1);
reverse(arr, 0, n/2-1);
reverse(arr, n/2, n-1);
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr) / sizeof(arr[0]);
rotate(arr, n);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
```
这个程序可以将一个长度为n的数组旋转180度。
相关问题
将reshape转化成c语言,输入三维数组,旋转90度 180度 270度
以下是将reshape转化为C语言代码,用于将三维数组旋转90度、180度、270度:
```c
#include <stdio.h>
// 三维数组旋转90度
void rotate_90(int arr[][3][3], int n) {
int temp[n][n][n];
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
for(int k = 0; k < n; k++) {
temp[i][j][k] = arr[n-k-1][i][j];
}
}
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
for(int k = 0; k < n; k++) {
arr[i][j][k] = temp[i][j][k];
}
}
}
}
// 三维数组旋转180度
void rotate_180(int arr[][3][3], int n) {
int temp[n][n][n];
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
for(int k = 0; k < n; k++) {
temp[i][j][k] = arr[n-i-1][n-j-1][n-k-1];
}
}
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
for(int k = 0; k < n; k++) {
arr[i][j][k] = temp[i][j][k];
}
}
}
}
// 三维数组旋转270度
void rotate_270(int arr[][3][3], int n) {
int temp[n][n][n];
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
for(int k = 0; k < n; k++) {
temp[i][j][k] = arr[k][n-j-1][i];
}
}
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
for(int k = 0; k < n; k++) {
arr[i][j][k] = temp[i][j][k];
}
}
}
}
int main() {
int arr[3][3][3] = {
{{1,2,3},{4,5,6},{7,8,9}},
{{10,11,12},{13,14,15},{16,17,18}},
{{19,20,21},{22,23,24},{25,26,27}}
};
printf("原数组:\n");
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++) {
for(int k = 0; k < 3; k++) {
printf("%d ", arr[i][j][k]);
}
printf("\n");
}
printf("\n");
}
rotate_90(arr, 3);
printf("旋转90度:\n");
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++) {
for(int k = 0; k < 3; k++) {
printf("%d ", arr[i][j][k]);
}
printf("\n");
}
printf("\n");
}
rotate_180(arr, 3);
printf("旋转180度:\n");
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++) {
for(int k = 0; k < 3; k++) {
printf("%d ", arr[i][j][k]);
}
printf("\n");
}
printf("\n");
}
rotate_270(arr, 3);
printf("旋转270度:\n");
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++) {
for(int k = 0; k < 3; k++) {
printf("%d ", arr[i][j][k]);
}
printf("\n");
}
printf("\n");
}
return 0;
}
```
这个程序将一个 $3\times3\times3$ 的三维数组进行了旋转。函数 `rotate_90` 将数组旋转90度,函数 `rotate_180` 将数组旋转180度,函数 `rotate_270` 将数组旋转270度。每个函数都使用了一个临时数组来保存旋转后的结果,然后将结果复制回原始数组。程序输出了原始数组和旋转后的数组。
使用c语言实现reshape函数,使用reshape函数将数组arr[3][4][5]旋转90度 180度 270度
首先,需要明确一点,C语言中的多维数组实际上是一维数组的“扁平化”表示。也就是说,arr[3][4][5]实际上是一个有3*4*5=60个元素的一维数组,其中arr[i][j][k]实际上是arr[i*4*5+j*5+k]。
接下来,我们可以通过一些数学推导来实现旋转操作。假设原数组为arr[a][b][c],旋转后的数组为arr_rot[a'][b'][c'],则有:
1. 顺时针旋转90度
arr_rot[a'][b'][c'] = arr[c][b][a']
其中a' = c,b' = b,c' = 2 - a。
2. 顺时针旋转180度
arr_rot[a'][b'][c'] = arr[c][3 - b][4 - a']
其中a' = 2 - a,b' = 3 - b,c' = c。
3. 顺时针旋转270度
arr_rot[a'][b'][c'] = arr[4 - c][b][a']
其中a' = 4 - c,b' = b,c' = a。
根据上述公式,我们就可以实现reshape函数了。具体实现代码如下:
```
#include <stdio.h>
void reshape(int *arr, int a, int b, int c, int *arr_rot, int a_rot, int b_rot, int c_rot) {
int i, j, k;
for (i = 0; i < a_rot; i++) {
for (j = 0; j < b_rot; j++) {
for (k = 0; k < c_rot; k++) {
int idx = i * b_rot * c_rot + j * c_rot + k;
int a_ori = c_rot - k - 1, b_ori = j, c_ori = i;
arr_rot[idx] = arr[a_ori * b * c + b_ori * c + c_ori];
}
}
}
}
int main() {
int arr[3][4][5];
int arr_rot[5][4][3];
int i, j, k;
// 初始化数组
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++) {
for (k = 0; k < 5; k++) {
arr[i][j][k] = i * 100 + j * 10 + k;
}
}
}
// 顺时针旋转90度
reshape((int *) arr, 3, 4, 5, (int *) arr_rot, 5, 4, 3);
printf("顺时针旋转90度:\n");
for (i = 0; i < 5; i++) {
for (j = 0; j < 4; j++) {
for (k = 0; k < 3; k++) {
printf("%d ", arr_rot[i][j][k]);
}
printf("\n");
}
printf("\n");
}
// 顺时针旋转180度
reshape((int *) arr, 3, 4, 5, (int *) arr_rot, 3, 4, 5);
reshape((int *) arr_rot, 3, 4, 5, (int *) arr, 3, 4, 5);
printf("顺时针旋转180度:\n");
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++) {
for (k = 0; k < 5; k++) {
printf("%d ", arr[i][j][k]);
}
printf("\n");
}
printf("\n");
}
// 顺时针旋转270度
reshape((int *) arr, 3, 4, 5, (int *) arr_rot, 5, 4, 3);
reshape((int *) arr_rot, 5, 4, 3, (int *) arr, 3, 4, 5);
printf("顺时针旋转270度:\n");
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++) {
for (k = 0; k < 5; k++) {
printf("%d ", arr[i][j][k]);
}
printf("\n");
}
printf("\n");
}
return 0;
}
```
注意,在reshape函数的参数中,我们需要传入原数组arr、旋转后的数组arr_rot,以及它们各自的维度大小a、b、c和a_rot、b_rot、c_rot。为了方便计算,这里我们将所有数组都转换成了一维数组,并使用指针进行传递。在实际使用中,我们可以根据需要进行调整。
最后,我们可以通过对三种旋转操作依次进行reshape,来实现任意角度的旋转。
阅读全文