所以我有2d数组填充随机数。例如:
#define d 4
int main(void)
{
int a[d][d];
int primary[d], secondary[d];
size_t i, j;
srand(time(NULL));
/* fill array with random numbers */
for (i = 0; i < d; i++)
for (j = 0; j < d; j++)
a[i][j] = rand() % 100;
/* save diagonals */
for (i = 0; i < d; i++)
{
primary[i] = a[i][i];
secondary[i] = a[d - (i + 1)][i];
如何镜像水平对角线?
例如:
1 0 0 2
0 3 4 0
0 5 6 0
7 0 0 8
8 0 0 7
0 6 5 0
0 4 3 0
2 0 0 1
任务是打印主矩阵,然后使用镜像对角线打印矩阵,但是我不知道这个循环应该是什么样的。
我考虑过将旋转矩阵旋转180度的循环但是我会松开未包含在对角线中的元素的位置。
或者我可以保存对角线然后以某种方式反转它。 这是矩阵和对角线的代码,我现在应该做什么。
希望得到你的帮助。
答案 0 :(得分:0)
方法之一是以下
#include <stdio.h>
#define N 4
int main(void)
{
int a[N][N] =
{
{ 1, 0, 0, 2 },
{ 0, 3, 4, 0 },
{ 0, 5, 6, 0 },
{ 7, 0, 0, 8 }
};
for ( size_t i = 0; i < N; i++ )
{
for ( size_t j = 0; j < N; j++ ) printf( "%d ", a[i][j] );
printf( "\n" );
}
printf( "\n" );
for ( size_t i = 0; i < N * N / 2; i++ )
{
int tmp = a[i / N][i % N];
a[i / N][i % N] = a[(N * N - i - 1) / N][(N * N - i - 1) % N];
a[(N * N - i - 1) / N][(N * N - i - 1) % N] = tmp;
}
for ( size_t i = 0; i < N; i++ )
{
for ( size_t j = 0; j < N; j++ ) printf( "%d ", a[i][j] );
printf( "\n" );
}
printf( "\n" );
return 0;
}
程序输出
1 0 0 2
0 3 4 0
0 5 6 0
7 0 0 8
8 0 0 7
0 6 5 0
0 4 3 0
2 0 0 1
可以使用指针编写相同的内容。例如
#include <stdio.h>
#define N 4
int main(void)
{
int a[N][N] =
{
{ 1, 0, 0, 2 },
{ 0, 3, 4, 0 },
{ 0, 5, 6, 0 },
{ 7, 0, 0, 8 }
};
for ( size_t i = 0; i < N; i++ )
{
for ( size_t j = 0; j < N; j++ ) printf( "%d ", a[i][j] );
printf( "\n" );
}
printf( "\n" );
for ( int *first = ( int * )a, *last = ( int * )a + N * N;
first < last;
++first, --last )
{
int tmp = first[0];
first[0] = last[-1];
last[-1] = tmp;
}
for ( size_t i = 0; i < N; i++ )
{
for ( size_t j = 0; j < N; j++ ) printf( "%d ", a[i][j] );
printf( "\n" );
}
printf( "\n" );
return 0;
}