现在的位置: 首页 > 综合 > 正文

统计两一维数组相等元素个数 &“折形”遍历二维矩阵

2012年09月13日 ⁄ 综合 ⁄ 共 2838字 ⁄ 字号 评论关闭

统计两个数组中相等元素的个数(要求用一维线性方法)

  1. int array_count(int* array1, int* array2)
  2. {
  3.     int i = 0, j = 0, count = 0;
  4.     while(i < NUM1 && j < NUM2)
  5.     {
  6.         if(array1[i] < array2[j])
  7.             i++;
  8.         else if(array1[i] > array2[j])
  9.             j++;
  10.         else
  11.         {
  12.             i++;
  13.             j++;
  14.             count++;
  15.         }
  16.     }
  17.     return count;
  18. }

按照下图所示搜索遍历输出二维数组

  1. #include <stdio.h>
  2. int m_print(int** data, int N)
  3. {
  4.     int i = 0, j = 0;
  5.     // 向左下方探索标志,为 0 则向右上方探索
  6.     int downleft = 1;
  7.     // 计数用于循环退出
  8.     int num = 0;
  9.     // 数组元素个数
  10.     int loop = N * N -1;
  11.     // N的奇偶标志,0 为偶数, 1 为奇数
  12.     int even = N % 2;
  13.     // 打印首个元素
  14.     printf("%d ", *((int*)(data) + i * N + j));
  15.     while(1)
  16.     {
  17.         // 位于上边界。(j != N - 1 || !even) 用于根据N的奇偶性处理右上方元素的特殊情况
  18.         if(i == 0 && (j != N - 1 || !even))
  19.         {
  20.             // 向右探索
  21.             j++;
  22.             // 输出元素
  23.             printf("%d ", *((int*)(data) + i * N + j));
  24.             // 完成输出则退出循环
  25.             if(++num >= loop) break;
  26.             // 设置为左下方探索
  27.             downleft = 1;
  28.         }
  29.         // 位于下边界
  30.         if(i == N - 1)
  31.         {
  32.             // 向右探索
  33.             j++;
  34.             // 输出元素
  35.             printf("%d ", *((int*)(data) + i * N + j));
  36.             if(++num >= loop) break;
  37.             // 设置为右上方探索
  38.             downleft = 0;
  39.         }
  40.         // 位于左边界
  41.         if(j == 0)
  42.         {
  43.             // 向下探索
  44.             i++;
  45.             // 输出元素
  46.             printf("%d ", *((int*)(data) + i * N + j));
  47.             if(++num >= loop) break;
  48.             // 设置为右上方探索
  49.             downleft = 0;
  50.         }
  51.         // 位于右边界
  52.         if(j == N - 1 && (i != 0 || even))
  53.         {
  54.             // 向下探索
  55.             i++;
  56.             // 输出元素
  57.             printf("%d ", *((int*)(data) + i * N + j));
  58.             // 完成输出则退出循环
  59.             if(++num >= loop) break;
  60.             // 设置为左下方探索
  61.             downleft = 1;
  62.         }
  63.         // 向左下方探索
  64.         if(downleft)
  65.         {
  66.             i++;
  67.             j--;
  68.         }
  69.         // 向右上方探索
  70.         else
  71.         {
  72.             i--; 
  73.             j++; 
  74.         }
  75.         // 输出元素
  76.         printf("%d ", *((int*)(data) + i * N + j));
  77.         // 完成输出则退出循环
  78.         if(++num >= loop) break;
  79.     }
  80.     return 0;
  81. }
  82. int data2[2][2] =
  83. {
  84.     {1, 2},
  85.     {3, 4}
  86. };
  87. int data3[3][3] = 
  88. {
  89.     {1, 2, 6},
  90.     {3, 5, 7},
  91.     {4, 8, 9}
  92. };
  93. int data4[4][4] =
  94. {
  95.     {1, 2, 6, 7}, 
  96.     {3, 5, 8, 13},
  97.     {4, 9, 12,14}, 
  98.     {10,11,15,16}
  99. };
  100. int data5[5][5] = 
  101. {
  102.     {1, 2, 6, 7, 15},
  103.     {3, 5, 8, 14,16},
  104.     {4, 9, 13,17,22},
  105.     {10,12,18,21,23},
  106.     {11,19,20,24,25}
  107. };
  108. int data6[6][6] = 
  109. {
  110.     {1, 2, 6, 7, 15,16},
  111.     {3, 5, 8, 14,17,26},
  112.     {4, 9, 13,18,25,27},
  113.     {10,12,19,24,28,33},
  114.     {11,20,23,29,32,34},
  115.     {21,22,30,31,35,36}
  116. };
  117. int main()
  118. {
  119.     m_print((int**)data2, 2);
  120.     printf("/n");
  121.     m_print((int**)data3, 3);
  122.     printf("/n");
  123.     m_print((int**)data4, 4);
  124.     printf("/n");
  125.     m_print((int**)data5, 5);
  126.     printf("/n");
  127.     m_print((int**)data6, 6);
  128.     printf("/n");
  129.     return 0;
  130. }

抱歉!评论已关闭.