- 论坛徽章:
- 0
|
#include <stdio.h>
#include <math.h>
#include <time.h>
#define NUM 100
void ary_init(int a[], int b[])
{ //初始化数组
int i;
srand(time(NULL));
for (i=0; i<NUM; i++)
{
a = rand()%10000;
}
for (i=0; i<NUM; i++)
{
b = rand()%100;
}
return;
}
long sum(int a[])
{ //数组求和
int i;
int s;
for (s=0,i=0; i<NUM; i++)
{
s += a;
}
return s;
}
int swap_times;
int sum_a, sum_b;
void change(int *a, int *b)
{ //数组元素交换
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
swap_times++;
return;
}
void prt_ary(int a[], int b[])
{ //列印两数组元素及各自元素和
int i;
for(i=0; i<NUM; i++)
{
printf("%5d ", a);
}
printf("\n" ;
for(i=0; i<NUM; i++)
{
printf("%5d ", b);
}
printf("\n" ;
printf("diff=%d sum_a=%d sum_b=%d all=%d\n", abs(sum_a-sum_b), sum_a, sum_b, sum_a+sum_b);
}
void slove(int a[], int b[])
{
int i;
int j;
int ab_diff, sum_aa, sum_bb, diff;
for(;
{
CONT:
ab_diff = abs(sum_a-sum_b);
for (i=0; i<NUM; i++)
{
for (j=0; j<NUM; j++)
{
diff= a-b[j];
sum_aa= sum_a-diff;
sum_bb= sum_b+diff;
diff= sum_aa-sum_bb;
if (abs(diff) < ab_diff)
{//判断是否需要交换元素
change(a+i, b+j);
sum_a= sum_aa;
sum_b= sum_bb;
if(diff==0)
return;
goto CONT;
}
}
}
break;
}
}
int main()
{
int a[NUM];
int b[NUM];
time_t stime, etime;
ary_init(a,b);//数组元素初始化
sum_a= sum(a);
sum_b= sum(b);
prt_ary(a, b);//列印当前数组状态
stime= time(NULL);
slove(a, b);//处理数组
etime= time(NULL);
prt_ary(a, b);//列印交换后数组状态
printf("\n" ;
printf("swap_times=%d, spend_time=%d secs\n", swap_times, etime-stime);
getch();
}
在前面兄弟(对不起,忘了是哪位兄弟了)的代码基础上进行了尽量优化,效率提高了很多.算法从逻辑上很容易理解,如果经过NxN次的扫描没有找到更小的差值,那结果应该是没有问题的.
[ 本帖最后由 w_cannon 于 2008-7-16 14:48 编辑 ] |
|