作业帮 > 综合 > 作业

平均分配倍数问题.(尽量用程序写出来 java什么的.)

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/22 19:38:47
平均分配倍数问题.(尽量用程序写出来 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 比较对应我的想法。
再答: //主方法调用 public void testSperateNumber(int fa){ double x = 2.55; double y = 3.24; double z = 5.55; double a,b,c; a = fa/(1+x/y+x/z); b = a*x/y; c = a*x/z; int o = (int) Math.round(a); int p = (int) Math.round(b); int q = (int) Math.round(c); double sumx; double sumy; double sumz; double lastMin; if (o+p+q == (fa-1)) { int t = o+1; sumx = t*x; sumy = p*y; sumz = q*z; double sum1 = printMaxMin(sumx,sumy,sumz); int u = p+1; sumx = o*x; sumy = u*y; sumz = q*z; double sum2 = printMaxMin(sumx,sumy,sumz); int v = q+1; sumx = o*x; sumy = p*y; sumz = v*z; double sum3 = printMaxMin(sumx,sumy,sumz); lastMin = getMinResult(sum1,sum2,sum3); }else if (o+p+q == (fa+1)) { int t = o-1; sumx = t*x; sumy = p*y; sumz = q*z; double sum1 = printMaxMin(sumx,sumy,sumz); int u = p-1; sumx = o*x; sumy = u*y; sumz = q*z; double sum2 = printMaxMin(sumx,sumy,sumz); int v = q-1; sumx = o*x; sumy = p*y; sumz = v*z; double sum3 = 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); } //为三个积排序,取最大最小之差 private double printMaxMin(double... nums){ if(nums == null || nums.length == 0){ return 0; } double max = nums[0]; double min = nums[0]; for (double d : nums) { if(d - max > 10e-6){ max = d; } if(min - d > 10e-6){ min = d; } } return (max - min); } //修补损失的精度 private double getMinResult(double... nums){ if(nums == null || nums.length == 0){ return 0; } double min = nums[0]; for (double d : nums) { if(min - d > 10e-6){ min = d; } } return min; } 我用枚举测试了一下,这个方法和枚举法出来的结果一样,测试数据用的是初始值: double x = 2.55; double y = 3.24; double z = 5.55; 然后瓜分0-1000这1001个数的结果。 测试结果已经写不下了。如果你要看,再追问,如果有代码看不懂的地方,也请追问。 很高兴能为您回答。
再问: 把主方法的调用写一下,非常感谢。
再答: public static void main(String agrs[]){ //你要的是1000,所以括号里就写1000就是了。你还可以填10000,100000等等 testSperateNumber(1000); }