Chinaunix首页 | 论坛 | 博客
  • 博客访问: 353279
  • 博文数量: 159
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 182
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-02 10:42
文章分类

全部博文(159)

文章存档

2015年(18)

2014年(132)

2013年(9)

分类: C/C++

2013-12-18 23:03:56


点击(此处)折叠或打开

  1. #include <iostream>
  2. #include <cmath>
  3.   
  4. using namespace std;
  5.  
  6.   
  7. int a[] = { 100, 98, 99, 1, 2,3 };
  8. int b[] = { 1, 2,3, 4, 5 ,40};
  9. int g_count = 6;
  10.   
  11. // 对数组进行求和
  12. int sum(int arr[], int n)
  13. {
  14.     int s = 0;
  15.     for (int i = 0; i < n; i++)
  16.     {
  17.         s += arr[i];
  18.     }
  19.     return s;
  20. }
  21.   
  22. void swap_(int n)
  23. {
  24.     int sa = sum(a, n);
  25.     int sb = sum(b, n);
  26.     int* mi;
  27.     int* ma;
  28.     if (sa > sb)
  29.     {
  30.         ma = a;
  31.         mi = b;
  32.     } // 根据大小来决定移动方向
  33.     else
  34.     {
  35.         ma = b;
  36.         mi = a;
  37.     }
  38.   
  39.     int diff = abs(sa - sb)/2; // 数组和差值
  40.     if (diff == 0) return; // 如果数组和之差是0,那么说明不需要再交换什么了
  41.       
  42.     int d = 0;
  43.     int maxindex;
  44.     int minindex;
  45.     for (int i = 0; i < n; i++) // 对所有的元素进行比较
  46.     {
  47.         for (int j = 0; j < n; j++)
  48.         {
  49.             int t = ma[i] - mi[j]; // 如果某对元素的差值,复合条件,并大于d,那么要更新d和当前下标
  50.             if (t > 0 && t <= diff && t>d)
  51.             {
  52.                 d = t;
  53.                 maxindex = i;
  54.                 minindex = j;
  55.             }
  56.         }
  57.     }
  58.   
  59.     if (d) // 最后如果d大于0,那么说明有需要交换的
  60.     {
  61.         // 进行交换后递归,在寻求下一个能交换的元素
  62.         int t = ma[maxindex];
  63.         ma[maxindex] = mi[minindex];
  64.         mi[minindex] = t;
  65.         swap_(n);
  66.     }
  67.   
  68.     // 如果d是0,那么不需要再找了,没有办法再缩小差距了
  69. }
  70.   
  71. /* 打印数组 */
  72. void print(int n)
  73. {
  74.     cout <<"now a[] is:";
  75.     for (int i = 0; i < n; i++)
  76.     {
  77.         cout << a[i] << " ";
  78.     }
  79.     cout << endl << "now b[] is:";
  80.     for (int j = 0; j < n; j++)
  81.     {
  82.         cout << b[j] << " ";
  83.     }
  84.     cout << endl << "--------------------" << endl;
  85. }
  86.   
  87. /* 测试主函数 */
  88. int main()
  89. {
  90.     // 先打印之前的数组
  91.     print(g_count);
  92.   
  93.     // 进行交换
  94.     swap_(g_count);
  95.   
  96.     // 打印交换后的数组
  97.     print(g_count);
  98.     system("pause");
  99. }

阅读(1538) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~