获取间隔

时间:2018-03-30 12:05:31

标签: java math

我想根据以下伪代码从两个变量中得到5到250之间的数字:

arg[1-19] * something = [5 - 250]

arg将包含[1 - 19]区间内的值(整数); something可以是任何整数。

问题是我使用argsomething的不同组合获得了相同的结果:

arg: 1, something: 10 => result 10
arg: 2, something:  5 => result 10

如何确保任何不同的argsomething对的结果不同?

java中是否有数学函数或函数来执行此操作?

3 个答案:

答案 0 :(得分:4)

我认为编程没有问题。相反,我认为你应该退后一步,尝试在数学水平上理解你的问题。考虑等式

(1) a * b = C

对于任何(任意选择的)C,abC为整数。

除非 ab 两个素数,否则至少会有一对其他a, b也满足等式。如果你想一下这个证据就很简单了:

假设a不是素数(b不是素数的证明是相同的)。那么必须至少有两个完整的数字pa'p根据定义不是一个)所以

(2) a = p * a'

现在定义

(3) b' = p * b

使用等式(2)和(3),您可以重新排列等式(1):

(4) C = a * b = (p * a') * b = a' * (p * b) = a' * b'

q.e.d

此处,p != 1(根据定义 - 见上文),a != a'b != b'

这意味着,如果您希望保证每个不同的对a, b都能提供不同的结果(a, b),则必须同时具有两个因素a * b

您没有告诉我们您实际想要实现的目标,但可能有一个比乘以两个整数更好的解决方案。

例如,如果我们知道您的something总是小于10(即0, 1, ..., 9),那么您可以(arg * 10) + something(这只是展示原则的一个例子;考虑到你提到的10的限制,它会给出199arg之间的值,所以它实际上不是你的问题的解决方案;我选择了这个数字,因为我们的十进制系统基本上这样工作:-)因此你已经知道了。)

最后,如此微不足道,以至于可能无法想到,请记住a * b = b * a(乘法至少对我们整个,真实和非理性的数字是可交换的,还有一些我不敢提及的)。适用于您的问题:arg * something = something * arg。当然,即使argsomething都是素数,这仍然是正确的。如果您交换argsomething的值,则不可避免地会得到相同的结果。对于你想要达到的目标,这可能是也可能是不可接受的。

答案 1 :(得分:2)

如果something的值超过12,则无法进行此操作,因为输入空间的大小至少为19 * 13 = 247,而输出空间的大小为{ {1}}。

如果245的值小于something,您只需执行:12假设您将19 *$something + arg + 4的值映射到区间something

答案 2 :(得分:0)

如果你的目标是给出一个“arg”号码,你会返回一个“某事”号码,使得arg*something的结果在给定的时间间隔内,请尝试:

public static void main (String[] args) throws java.lang.Exception
    {
        System.out.println(findNumber(2, 5, 250));
    }

public static int findNumber(int arg, int min, int max) {
    Random rand = new Random();
    int randMin;
    int randMax;
    if(min%arg == 0){
        randMin = min/arg;
    } else {
        randMin = (min / arg) + 1;
    }
    randMax = max/arg;
    int result = rand.nextInt(randMax+1-randMin);
    result = result + randMin;
    return result;
}