- 注册时间
- 2007-12-28
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 12785
- 在线时间
- 小时
|
发表于 2013-8-22 18:23:12
|
显示全部楼层
我的程序计算的结果是{6,37,234,1479,9355},比8楼的结果更均衡。
这个程序只对第二项以后的数进行调整,楼主可改良一下,看看是否在某些情况下,调整首项更好些。
下面是全部源代码。- #include "stdio.h"
- #include "stdlib.h"
- #include "math.h"
- void calc_max_min_ratio(int arr[], int len, int* pIdx_max, int* pIdx_min)
- {
- int i,idx_max,idx_min;
- double max,min;
- idx_max=idx_min=0;
- min=max=(double)arr[1] / (double)arr[0];
- for (i=1;i<len-1;i++)
- {
- if ( (double)arr[i+1] / (double)arr[i] > max)
- {
- max=(double)arr[i+1] / (double)arr[i];
- idx_max=i;
- }
-
- if ( (double)arr[i+1] / (double)arr[i] < min)
- {
- min=(double)arr[i+1] / (double)arr[i];
- idx_min=i;
- }
- }
- *pIdx_max=idx_max;
- *pIdx_min=idx_min;
- }
- void split_int(int s,int n, int arr[] )
- {
- double q0,q1;
- double qMin, qMax;
- int i,idx_max,idx_min,s1,s2;
- q0=pow( (double)s,1.0/(double)n);
- arr[0]=(int)q0;
- for (i=1;i<n;i++)
- arr[i]=(int)( (double)arr[i-1] * q0);
-
- for (s1=0,i=0;i<n;i++)
- s1+=arr[i];
- calc_max_min_ratio(arr,n,&idx_max,&idx_min);
-
- //printf("s1=%d\n",s1);
- //printf("max ratio is %.6f\n", (double)arr[idx_max+1]/(double)arr[idx_max]);
- //printf("min ratio is %.6f\n", (double)arr[idx_min+1]/(double)arr[idx_min]);
- //以下迭代过程调整数组的公比
- while (s1 != s)
- {
- if (s1>s) //降低公比
- {
- arr[idx_max+1]--;
- q1=(double)(arr[idx_max+1])/(double)(arr[idx_max]) ;
-
- for (i=idx_max+2;i<n;i++)
- arr[i]=(int)( (double)arr[i-1] * q0);
- }
- else //增加公比
- {
- arr[idx_max+1]++;
- q1= (double)(arr[idx_min+1])/(double)(arr[idx_min]);
-
- for (i=idx_min+2;i<n;i++)
- arr[i]=(int)( (double)arr[i-1] * q0);
- }
-
- calc_max_min_ratio(arr,n,&idx_max,&idx_min);
-
- for (s2=0,i=0;i<n;i++)
- s2+=arr[i];
-
- if (s1>s && s2<s)
- break;
- else if (s1<s && s2>s)
- break;
-
- s1=s2;
- q0=q1;
- //printf("s1=%d\n",s1);
- //printf("max ratio is %.6f\n", (double)arr[idx_max+1]/(double)arr[idx_max]);
- //printf("min ratio is %.6f\n", (double)arr[idx_min+1]/(double)arr[idx_min]);
- }
-
- if (q1<q0)
- {
- double t;
- t=q0; q0=q1; q1=t; //q0是公比期望下限, q1是公比期望上限
- }
- if (s2==s)
- return;
- else if (s2<s)
- arr[n-1] += ( s-s2);
- else
- arr[n-1] -= ( s2-s);
-
-
- //以下迭代过程对数组各个元素进行微调
- while ( 1)
- {
-
- double tq,d;
- tq=(q0+q1)/2;
-
- calc_max_min_ratio(arr,n,&idx_max,&idx_min);
- qMin=(double)(arr[idx_min+1])/(double)(arr[idx_min]) ;
- qMax=(double)(arr[idx_max+1])/(double)(arr[idx_max]) ;
- //printf("max ratio is %.6f\n", qMax);
- //printf("min ratio is %.6f\n", qMin);
- if (qMax>q1) //某2项的比超过期望值
- {
- d= ((double)(arr[idx_max+1]) - (double)(arr[idx_max]) * tq)/(tq+1) ;
- if ( fabs(d)<0.6)
- break;
- arr[idx_max+1] -= (int)d;
- arr[idx_max] += (int)d;
- }
- else if ( qMin<q0) //某2项的比低于期望值
- {
- d= ( (double)(arr[idx_max]) * tq -(double)(arr[idx_max+1]))/(tq+1) ;
- if ( fabs(d)<0.6)
- break;
- arr[idx_max+1] += (int)d;
- arr[idx_max] -= (int)d;
- }
- else
- {
- break;
- }
- }
- printf("array is {");
- for (s1=0,i=0;i<n;i++)
- { s1+=arr[i]; printf("%d,",arr[i]); }
- printf("}\nsum is %d\n",s1);
-
- calc_max_min_ratio(arr,n,&idx_max,&idx_min);
- qMin=(double)(arr[idx_min+1])/(double)(arr[idx_min]) ;
- qMax=(double)(arr[idx_max+1])/(double)(arr[idx_max]) ;
- printf("max ratio is %.6f\n", qMax);
- printf("min ratio is %.6f\n", qMin);
- }
- int main(int argc, char* argv[])
- {
- int s,n;
- int arr[64];
- s=11111;
- n=5;
- split_int(s,n,arr);
- return 0;
- }
复制代码 |
评分
-
查看全部评分
|