将给定数字按两个比例除以该数字的一个组成部分的算法

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" ,您的代码将抛出内存不足。

问题已通过三角测量解决。谢谢大家的帮助。