Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将给定数字按两个比例除以该数字的一个分量的算法_Java_Algorithm_Linear Programming - Fatal编程技术网

Java 将给定数字按两个比例除以该数字的一个分量的算法

Java 将给定数字按两个比例除以该数字的一个分量的算法,java,algorithm,linear-programming,Java,Algorithm,Linear Programming,请帮助我理解用于以下问题的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也可以是负数 1n=6,r=0.2,a=n*r/100=10*0.2/100=0.012 2n=4,r=a*100/n=0.068*100/4=1.7,a=0.068我想我现

请帮助我理解用于以下问题的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也可以是负数

1n=6,r=0.2,a=n*r/100=10*0.2/100=0.012


2n=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谢谢@Ole V.V的解决方案。我在下面运行了你的代码

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 我们实际上需要在给定范围内的r,对于[1]和[2],它应该是不同的。 代码实际上应该只打印n1、a1、r1和n2、a2、r2,其中r在给定的r范围内
对于较大数量的a和r,您的代码将抛出内存。

使用三角剖分解决了该问题。谢谢大家的帮助。

你的问题是。。。你想做什么?我在这个问题上看到的是,你疯狂地扭曲方程rn=100a。如果你不告诉我们你不明白的是什么,我们就帮不了你。嗨,Pemapmoder,是的,rn=100a是一个等式。嘿,azurefrog——我不明白的是,我如何将a&n分成两个分量,就像我在第一篇文章中给出的例子那样,使用java程序使r在给定的范围内。我给出的例子只是一个输入,有许多不同的n和a值,r的范围不同。对不起,如果我把你弄糊涂了。在两个分量中除法意味着什么?对于n的任何值,你可以随机选择0.012到2.000之间的任意r值,然后简单地从中计算出a。-恐怕我不明白分量、部分和比率与什么有关。请澄清问题。你们得到的结果和我预料的一样。当我说“如果输入满足r*n=100*a”时,我还假设了0.012,我忘了说,我还假设n是大于0的整数。如果n是long或其他数据类型,并且大于Integer.MAX_值,则我的代码可能会永远运行。我认为您不应该将应答字段用于注释。这毕竟不是问题的答案。:-有关问题的新信息,如a和n的可能值,请编辑您的问题。对于其他注释,请使用答案下的“添加注释”链接。但是r似乎任何时候都不在范围内。第一个版本根据输入计算r,并且不检查它是否在范围内,但如果它在范围外,我认为在任何解决方案中都不可能在范围内。改进版用于计算范围内的r1和r2,如果不能打印,则不打印解决方案。如果它的行为不同,那就是一个错误。
    // 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);
        }
    }
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