将给定数字按两个比例除以该数字的一个组成部分的算法
Algorithm to divide a given number in two proportions by one of the component of that number
请帮助我理解 JAVA 用于以下问题的算法或技术。
共有三个组成部分
a = n * r / 100
r = (a*100) / n
n = (a/r) * 100
要求将a&n按比例分成两部分,r在0.012到2.000之间
示例:
给出详细信息
n=10 ,r=0.8 ,a=10 * 0.8 / 100 = 0.08
下面应该是 n、r 和 a 的值
r 应介于 0.012 和 2.000 之间
n 和 r 也可以是负数。
1)n=6,r=0.2,a=n * r / 100 = 10 * 0.2 / 100 = 0.012
2)n=4 ,r=(a*100) / n = 0.068 * 100 / 4 = 1.7 ,a= 0.068
我想我现在明白了:给定 n、a 和 r,你想找到 n1、a1、r1、n2、a2 和 r2 以便 n1 + n2 = n, a1 + a2 = a, r1 * n1 = 100 * a1, r2 * n2 = 100 * a2, 0.012 <= r1 <= 2.0 和 r2 相同。这个对吗? 6个未知数,4个方程和4个不等式,可以轻松给出无限多解。
如果输入满足 r * n = 100 * a 并且 n 至少为 2,您可以找到许多解决方案:
r = a * 100 / n;
for (int n1 = 1; n1 < n; n1++) {
double proportion = (double) n1 / (double) n;
System.out.println("[1] n = " + n1 + " a = " + a * proportion + " r = " + r);
proportion = 1 - proportion;
System.out.println("[2] n = " + (n - n1) + " a = " + a * proportion + " r = " + r);
}
如果输入不满足方程,它会变得更棘手,据我所知可能有 0 个或无限多个解。
免责声明:我不太记得年轻时学过的线性规划,所以我不会尝试应用其中的任何一个。
编辑:改进版,忽略输入的r
,只打印指定范围内r的解决方案,但可能打印的解决方案是以前的两倍,已经太多了。
// without loss of generality assume n1 <= n2
for (int n1 = 1; n1 <= n / 2; n1++) {
int n2 = n - n1;
// a1 should be >= rMin * n1 / 100 and also = a - a2, that is >= a - rMax * n2 / 100
double a1Min = Math.max(rMin * n1 / 100, a - (rMax * n2 / 100));
double a1Max = Math.min(rMax * n1 / 100, a - rMin * n2 / 100);
if (a1Min <= a1Max) {
// print solution with a1 = a1Min
System.out.println("[1] n = " + n1 + " a = " + a1Min + " r = " + 100 * a1Min / n1);
double a2 = a - a1Min;
System.out.println("[2] n = " + n2 + " a = " + a2 + " r = " + 100 * a2 / n2);
// print solution with a1 = a1Max
System.out.println("[1] n = " + n1 + " a = " + a1Max + " r = " + 100 * a1Max / n1);
a2 = a - a1Max;
System.out.println("[2] n = " + n2 + " a = " + a2 + " r = " + 100 * a2 / n2);
}
}
感谢@Ole V.V solution.I 运行 你的代码反对下面
double a = 10000;//can be 40,000,000
double n = 50000;//can b 5,000,000,000
double r = a * 100 / n;//should be between a given range
但是,在输出中 "r" 对于每次迭代始终是常量 (20.0)
我们实际上需要在给定的 运行ge 之间使用 r,[1] 和 [2] 应该不同。
代码实际上应该只打印 n1,a1,r1 和 n2,a2,r2 ,其中 "r" 介于 "r" 的给定 运行ge 之间
对于更大数量的 "a" 和 "r" ,您的代码将抛出内存不足。
问题已通过三角测量解决。谢谢大家的帮助。
请帮助我理解 JAVA 用于以下问题的算法或技术。
共有三个组成部分
a = n * r / 100
r = (a*100) / n
n = (a/r) * 100
要求将a&n按比例分成两部分,r在0.012到2.000之间
示例:
给出详细信息
n=10 ,r=0.8 ,a=10 * 0.8 / 100 = 0.08
下面应该是 n、r 和 a 的值 r 应介于 0.012 和 2.000 之间 n 和 r 也可以是负数。
1)n=6,r=0.2,a=n * r / 100 = 10 * 0.2 / 100 = 0.012
2)n=4 ,r=(a*100) / n = 0.068 * 100 / 4 = 1.7 ,a= 0.068
我想我现在明白了:给定 n、a 和 r,你想找到 n1、a1、r1、n2、a2 和 r2 以便 n1 + n2 = n, a1 + a2 = a, r1 * n1 = 100 * a1, r2 * n2 = 100 * a2, 0.012 <= r1 <= 2.0 和 r2 相同。这个对吗? 6个未知数,4个方程和4个不等式,可以轻松给出无限多解。
如果输入满足 r * n = 100 * a 并且 n 至少为 2,您可以找到许多解决方案:
r = a * 100 / n;
for (int n1 = 1; n1 < n; n1++) {
double proportion = (double) n1 / (double) n;
System.out.println("[1] n = " + n1 + " a = " + a * proportion + " r = " + r);
proportion = 1 - proportion;
System.out.println("[2] n = " + (n - n1) + " a = " + a * proportion + " r = " + r);
}
如果输入不满足方程,它会变得更棘手,据我所知可能有 0 个或无限多个解。
免责声明:我不太记得年轻时学过的线性规划,所以我不会尝试应用其中的任何一个。
编辑:改进版,忽略输入的r
,只打印指定范围内r的解决方案,但可能打印的解决方案是以前的两倍,已经太多了。
// without loss of generality assume n1 <= n2
for (int n1 = 1; n1 <= n / 2; n1++) {
int n2 = n - n1;
// a1 should be >= rMin * n1 / 100 and also = a - a2, that is >= a - rMax * n2 / 100
double a1Min = Math.max(rMin * n1 / 100, a - (rMax * n2 / 100));
double a1Max = Math.min(rMax * n1 / 100, a - rMin * n2 / 100);
if (a1Min <= a1Max) {
// print solution with a1 = a1Min
System.out.println("[1] n = " + n1 + " a = " + a1Min + " r = " + 100 * a1Min / n1);
double a2 = a - a1Min;
System.out.println("[2] n = " + n2 + " a = " + a2 + " r = " + 100 * a2 / n2);
// print solution with a1 = a1Max
System.out.println("[1] n = " + n1 + " a = " + a1Max + " r = " + 100 * a1Max / n1);
a2 = a - a1Max;
System.out.println("[2] n = " + n2 + " a = " + a2 + " r = " + 100 * a2 / n2);
}
}
感谢@Ole V.V solution.I 运行 你的代码反对下面
double a = 10000;//can be 40,000,000
double n = 50000;//can b 5,000,000,000
double r = a * 100 / n;//should be between a given range
但是,在输出中 "r" 对于每次迭代始终是常量 (20.0)
我们实际上需要在给定的 运行ge 之间使用 r,[1] 和 [2] 应该不同。
代码实际上应该只打印 n1,a1,r1 和 n2,a2,r2 ,其中 "r" 介于 "r" 的给定 运行ge 之间
对于更大数量的 "a" 和 "r" ,您的代码将抛出内存不足。
问题已通过三角测量解决。谢谢大家的帮助。