满意答案
sdfgawrt
2016.08.31
采纳率:57% 等级:9
已帮助:14人
以下程序供你参考
以下函数通过系统时间随机生成1-100之间的随机数,分成两组后使其总和差值最小。
算法分析:见源程序中的注释,算法可能有些许额误差,共参考。
#include
#include
#include
//******************产生长度为length的不为0的可重复随机数组******************//
void radomArray(int *array,int length)
{
srand((unsigned)time(NULL));//使用系统时间作为随机数的种子产生随机数
int i=0,j=0;
while(j
{
i=rand()%100;//0-100的随机数,可做修改
if(i!=0)//随机数不为0
{
array[j]=i;
j++;
}
}
}
//******************给数组排序,从大到小******************//
void sequence(int * array,int len)
{
int tmp=0;
for(int m=0;m
{
for(int n=0;n
{
if(array[m]>array[n])
{
tmp=array[n];array[n]=array[m];array[m]=tmp;
}
else continue;
}
}
}
//******************将数组拆分为长度为len_01和长度为len_02的两列并总和差值最小******************//
/*算法分析:将有序数组(大到小)中数据依次分别放入数组1、数组2中,并分别统计其现有数据的总和,分别存入dat_01,dat_02中,
初始化判断标准dat_01,dat_02为0;
根据数组现有数据总和dat_01和dat_02的关系,确定数据存入数组1还是数组2。
判断过程:如果数组1现有数据总和小于数组2,同时数组1未到上限,将下一个数据存入数组1;
如果数组1现有数据综合不小于数组2,同时数组2未到上限,将下一个数据存入数组2。
可能漏洞:数组1或数组2提前到达数组上限,导致原数组中剩余数据直接转入另一数组中,出现异常结果。*/
void seperate(int *arr,int * arr_01,int *arr_02,int len_01,int len_02)
{
int i=0,j=0,dat_01=0,dat_02=0;
for(int k=0;k
{
if(dat_01
{
arr_01[i]=arr[k];
dat_01+=arr[k];
i++;
}
else if(dat_01>=dat_02&&j
组2
{
arr_02[j]=arr[k];
dat_02+=arr[k];
j++;
}
}
}
//******************计算并返回长度为length的数组的数字总和******************//
int sum(int a[],int length)
{
int total=0;
for(int i=0;i
{
total+=a[i];
}
return total;
}
//******************主函数开始******************//
void main()
{
int data1=0,data2=0,tmp=0;
int len=100,len_01=50,len_02=50;//修改此处len,len_01,len_02即可修改初始数组长度,注意len_01+len_02=len,同
时最好len_01=len_02,防止出现异常。
int data[100],data_1[50],data_2[50];//上述len,len_01,len_02修改后,此处数组长度应相应修改。
radomArray(data,len);//产生100个数据的随机数组
sequence(data,len);//给随机数组从小到大排序
printf("产生的随机数组从小到大排列为:\n");
for(tmp=0;tmp
printf("%d\t",data[tmp]);
printf("\n");
seperate(data,data_1,data_2,len_01,len_02);//将数组分为两块,使其总和差值最小
printf("第一块数组为:\n");
for(tmp=0;tmp
{
printf("%d\t",data_1[tmp]);
}
printf("\n");
printf("第二块数组为:\n");
for(tmp=0;tmp
{
printf("%d\t",data_2[tmp]);
}
printf("\n");
printf("最原始数组的数据总和为:%d\n",sum(data,len));
printf("拆分后数组的数据总和为:%d\n",sum(data_1,len_01)+sum(data_2,len_02));
printf("第一块数组的数据总和为:%d\n",sum(data_1,len_01));
printf("第二块数组的数据总和为:%d\n",sum(data_2,len_02));
printf("两块数组数据的的差值为:%d\n",sum(data_1,len_01)-sum(data_2,len_02));
}
运行结果:
产生的随机数组从小到大排列为:
993 979 970 962 957 935 914 902 888 883
871 866 862 859 843 840 829 827 824 815
810 808 805 796 784 768 738 730 725 722
721 712 711 709 704 702 693 670 670 650
631 627 623 623 614 607 606 598 577 574
547 498 495 495 481 478 451 448 447 429
410 388 383 381 380 379 377 364 344 337
308 271 266 257 233 208 204 200 189 165
162 155 150 145 143 119 117 114 114 110
108 69 64 61 48 45 22 16 11 3
第一块数组为:
979 970 957 902 883 871 859 840 829 815
810 805 768 738 725 721 709 702 670 670
631 623 607 606 574 498 495 481 451 447
410 383 379 377 337 271 266 233 200 189
155 145 119 117 114 108 61 45 11 3
第二块数组为:
993 962 935 914 888 866 862 843 827 824
808 796 784 730 722 712 711 704 693 650
627 623 614 598 577 547 495 478 448 429
388 381 380 364 344 308 257 208 204 165
162 150 143 114 110 69 64 48 22 16
最原始数组的数据总和为:51116
拆分后数组的数据总和为:51116
第一块数组的数据总和为:25559
第二块数组的数据总和为:25557
两块数组数据的的差值为:2
Press any key to continue
00分享举报