二维数组元素行列交换
起始二维数组ar[2][3]:
1 2 3
4 5 6
目标二维数组br[3][2]:
1 4
2 5
3 6
#include<stdio.h>
#include<assert.h>
void Print_Ar(int(*ar)[3], int n, int m)
{
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
{
printf("%4d ", ar[i][j]);
}
printf("\n");
}
}
void Print_Br(int (*br)[2], int n, int m)
{
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
{
printf("%4d ", br[i][j]);
}
printf("\n");
}
}
void Exchange(int(*ar)[3], int(*br)[2], int n, int m)
{
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
{
br[i][j] = ar[j][i];
}
}
}
int main()
{
const int n = 2, m = 3;
int ar[n][m] = { 1,2,3,4,5,6 };
int br[m][n] = {};
Exchange(ar, br, n, m);
Print_Ar(ar, m, n);
printf("\n");
Print_Br(br, n, m);
return 0;
}
杨辉三角
定义一个10*10的二维数组,用来存放杨辉三角。
输入杨辉三角的行数,计算杨辉三角并存放在二维数组中,最后输出二维数组。
#include<stdio.h>
#include<assert.h>
void Print_Ar(int(*br)[10], int n)
{
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
if (0 == br[i][j])
{
printf(" ");
}
else
{
printf("%4d", br[i][j]);
}
}
printf("\n");
}
}
void Pascal_Triangle(int(*br)[10], int n, int k)
{
if (k < 1 || k > 10)
{
printf("error!");
}
else
{
for (int i = 0; i < k; ++i)
{
br[i][0] = 1;
br[i][i] = 1;
for (int j = 1; j < i; ++j)
{
br[i][j] = br[i - 1][j - 1] + br[i - 1][j];
}
}
}
}
int main()
{
const int n = 10;
int ar[n][n] = {};
int x1 = 1;
int x2 = 5;
int x3 = 10;
Pascal_Triangle(ar, n, x1);
Print_Ar(ar, n);
Pascal_Triangle(ar, n, x2);
Print_Ar(ar, n);
Pascal_Triangle(ar, n, x3);
Print_Ar(ar, n);
return 0;
}
二维数组查询数据(分块查询)
二维数组为有序数组。
从二维数组中第一个一维数组进行判断,目标数据是否在数组中。
如果在,则在数组中进行下一步查找;如果不在,则判断下一个一维数组。
#include<stdio.h>
#include<assert.h>
void Find(int(*br)[4], int row, int col, int k)
{
int tag = 0;
for (int j = 0; j < col; ++j)
{
if (k == br[row][j])
{
printf("%d的位置是[%d,%d]\n", k, row, j);
tag = 1;
}
}
if (!tag)
{
printf("%d not find!\n", k);
}
}
void Partitioned(int(*br)[4], int row, int col, int k)
{
int num = -1;
for (int i = 0; i < row; ++i)
{
if (br[i][0] <= k && k <= br[i][col - 1])
{
num = i;
}
}
if (-1 == num)
{
printf("%d not find!\n", k);
}
else
{
Find(br, num, col, k);
}
}
int main()
{
int ar[3][4] = {
{12,23,34,45},
{56,67,78,89},
{91,93,96,99}
};
int k1 = 1;
int k2 = 12;
int k3 = 67;
int k4 = 99;
int k5 = 100;
Partitioned(ar, 3, 4, k1);
Partitioned(ar, 3, 4, k2);
Partitioned(ar, 3, 4, k3);
Partitioned(ar, 3, 4, k4);
Partitioned(ar, 3, 4, k5);
return 0;
}
二维数组查询数据(二分查找)
数组在内存中存储位置相邻(如上图),所以使指针指向二维数组中第一个数组的第一个元素的首地址,指针移动就能依次读出二维数组每个数,相当于将二维数组合并成一个一维数组,然后用指针再进行一维数组的二分查找。
如果找到了,输出此时目标的数据,将数据对二维数组中一维数组的元素个数进行整数除法求行坐标;将数据对二维数组中一维数组的元素个数进行取余求列坐标。
#include<stdio.h>
#include<assert.h>
void Print(int num, int k)
{
if (-1 == num)
{
printf("%d not find!\n", k);
}
else
{
int row = num / 4;
int col = num % 4;
printf("%d的位置是[%d,%d]\n", k, row, col);
}
}
void Partitioned(int(*br)[4], int row, int col, int k)
{
int num = -1;
int sum = row * col;
int left = 0;
int right = sum;
while (left <= right && -1 == num)
{
int mid = (left + right) / 2;
if (k == br[0][mid])
{
num = mid;
}
else if(k < br[0][mid])
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
Print(num,k);
}
int main()
{
int ar[3][4] = {
{12,23,34,45},
{56,67,78,89},
{91,93,96,99}
};
int k1 = 1;
int k2 = 12;
int k3 = 67;
int k4 = 99;
int k5 = 100;
Partitioned(ar, 3, 4, k1);
Partitioned(ar, 3, 4, k2);
Partitioned(ar, 3, 4, k3);
Partitioned(ar, 3, 4, k4);
Partitioned(ar, 3, 4, k5);
return 0;
}