问题标题:
平均分配倍数问题.(尽量用程序写出来java什么的.)1000倍平均分配到三个数上,比如:2.44,1.57,4.87,使之三个数与它分配给的倍数的乘积相差最小.1000倍整数分配给这三个数,不分配为小数.请高手
问题描述:
平均分配倍数问题.(尽量用程序写出来java什么的.)
1000倍平均分配到三个数上,比如:2.44,1.57,4.87,使之三个数与它分配给的倍数的乘积相差最小.1000倍整数分配给这三个数,不分配为小数.请高手写个算法.(非常报歉我这里没有财富)
1000倍不是平均分配,描述有点错误.
方京华回答:
“使之三个数与它分配给的倍数的乘积相差最小”这句话有点含糊不清.
比如说我用这三个数去乘以了分别分配给它们的三个数:得到了新的三个数(120,123,127),三个数怎么求相差最小?
就拿这三个数来说:(120,123,127),怎么获得差值?
是:
127-123-120=-116
还是:
(127-123)+(123-120)=7
还是其他怎么个算出来的?
如果这个需求不给明白,算法可能不一样.
宋加仁回答:
就是这三个数的分别乘以各自的倍数后,各自相差不是很大,(127-123)+(123-120)=7这样解释可以吗?你写的这个:,(127-123)+(123-120)=7比较对应我的想法。
宋加仁回答:
//主方法调用publicvoidtestSperateNumber(intfa){doublex=2.55;doubley=3.24;doublez=5.55;doublea,b,c;a=fa/(1+x/y+x/z);b=a*x/y;c=a*x/z;into=(int)Math.round(a);intp=(int)Math.round(b);intq=(int)Math.round(c);doublesumx;doublesumy;doublesumz;doublelastMin;if(o+p+q==(fa-1)){intt=o+1;sumx=t*x;sumy=p*y;sumz=q*z;doublesum1=printMaxMin(sumx,sumy,sumz);intu=p+1;sumx=o*x;sumy=u*y;sumz=q*z;doublesum2=printMaxMin(sumx,sumy,sumz);intv=q+1;sumx=o*x;sumy=p*y;sumz=v*z;doublesum3=printMaxMin(sumx,sumy,sumz);lastMin=getMinResult(sum1,sum2,sum3);}elseif(o+p+q==(fa+1)){intt=o-1;sumx=t*x;sumy=p*y;sumz=q*z;doublesum1=printMaxMin(sumx,sumy,sumz);intu=p-1;sumx=o*x;sumy=u*y;sumz=q*z;doublesum2=printMaxMin(sumx,sumy,sumz);intv=q-1;sumx=o*x;sumy=p*y;sumz=v*z;doublesum3=printMaxMin(sumx,sumy,sumz);lastMin=getMinResult(sum1,sum2,sum3);}else{sumx=o*x;sumy=p*y;sumz=q*z;lastMin=printMaxMin(sumx,sumy,sumz);}System.out.println(lastMin);}//为三个积排序,取最大最小之差privatedoubleprintMaxMin(double...nums){if(nums==null||nums.length==0){return0;}doublemax=nums[0];doublemin=nums[0];for(doubled:nums){if(d-max>10e-6){max=d;}if(min-d>10e-6){min=d;}}return(max-min);}//修补损失的精度privatedoublegetMinResult(double...nums){if(nums==null||nums.length==0){return0;}doublemin=nums[0];for(doubled:nums){if(min-d>10e-6){min=d;}}returnmin;}我用枚举测试了一下,这个方法和枚举法出来的结果一样,测试数据用的是初始值:doublex=2.55;doubley=3.24;doublez=5.55;然后瓜分0-1000这1001个数的结果。测试结果已经写不下了。如果你要看,再追问,如果有代码看不懂的地方,也请追问。很高兴能为您回答。
宋加仁回答:
把主方法的调用写一下,非常感谢。
方京华回答:
publicstaticvoidmain(Stringagrs[]){//你要的是1000,所以括号里就写1000就是了。你还可以填10000,100000等等testSperateNumber(1000);}
点击显示
其它推荐
热门其它推荐