统计两个数组中相等元素的个数(要求用一维线性方法)
- int array_count(int* array1, int* array2)
- {
- int i = 0, j = 0, count = 0;
- while(i < NUM1 && j < NUM2)
- {
- if(array1[i] < array2[j])
- i++;
- else if(array1[i] > array2[j])
- j++;
- else
- {
- i++;
- j++;
- count++;
- }
- }
- return count;
- }
按照下图所示搜索遍历输出二维数组
- #include <stdio.h>
- int m_print(int** data, int N)
- {
- int i = 0, j = 0;
- // 向左下方探索标志,为 0 则向右上方探索
- int downleft = 1;
- // 计数用于循环退出
- int num = 0;
- // 数组元素个数
- int loop = N * N -1;
- // N的奇偶标志,0 为偶数, 1 为奇数
- int even = N % 2;
- // 打印首个元素
- printf("%d ", *((int*)(data) + i * N + j));
- while(1)
- {
- // 位于上边界。(j != N - 1 || !even) 用于根据N的奇偶性处理右上方元素的特殊情况
- if(i == 0 && (j != N - 1 || !even))
- {
- // 向右探索
- j++;
- // 输出元素
- printf("%d ", *((int*)(data) + i * N + j));
- // 完成输出则退出循环
- if(++num >= loop) break;
- // 设置为左下方探索
- downleft = 1;
- }
- // 位于下边界
- if(i == N - 1)
- {
- // 向右探索
- j++;
- // 输出元素
- printf("%d ", *((int*)(data) + i * N + j));
- if(++num >= loop) break;
- // 设置为右上方探索
- downleft = 0;
- }
- // 位于左边界
- if(j == 0)
- {
- // 向下探索
- i++;
- // 输出元素
- printf("%d ", *((int*)(data) + i * N + j));
- if(++num >= loop) break;
- // 设置为右上方探索
- downleft = 0;
- }
- // 位于右边界
- if(j == N - 1 && (i != 0 || even))
- {
- // 向下探索
- i++;
- // 输出元素
- printf("%d ", *((int*)(data) + i * N + j));
- // 完成输出则退出循环
- if(++num >= loop) break;
- // 设置为左下方探索
- downleft = 1;
- }
- // 向左下方探索
- if(downleft)
- {
- i++;
- j--;
- }
- // 向右上方探索
- else
- {
- i--;
- j++;
- }
- // 输出元素
- printf("%d ", *((int*)(data) + i * N + j));
- // 完成输出则退出循环
- if(++num >= loop) break;
- }
- return 0;
- }
- int data2[2][2] =
- {
- {1, 2},
- {3, 4}
- };
- int data3[3][3] =
- {
- {1, 2, 6},
- {3, 5, 7},
- {4, 8, 9}
- };
- int data4[4][4] =
- {
- {1, 2, 6, 7},
- {3, 5, 8, 13},
- {4, 9, 12,14},
- {10,11,15,16}
- };
- int data5[5][5] =
- {
- {1, 2, 6, 7, 15},
- {3, 5, 8, 14,16},
- {4, 9, 13,17,22},
- {10,12,18,21,23},
- {11,19,20,24,25}
- };
- int data6[6][6] =
- {
- {1, 2, 6, 7, 15,16},
- {3, 5, 8, 14,17,26},
- {4, 9, 13,18,25,27},
- {10,12,19,24,28,33},
- {11,20,23,29,32,34},
- {21,22,30,31,35,36}
- };
- int main()
- {
- m_print((int**)data2, 2);
- printf("/n");
- m_print((int**)data3, 3);
- printf("/n");
- m_print((int**)data4, 4);
- printf("/n");
- m_print((int**)data5, 5);
- printf("/n");
- m_print((int**)data6, 6);
- printf("/n");
- return 0;
- }