我想根据以下伪代码从两个变量中得到5到250之间的数字:
arg[1-19] * something = [5 - 250]
arg
将包含[1 - 19]
区间内的值(整数); something
可以是任何整数。
问题是我使用arg
和something
的不同组合获得了相同的结果:
arg: 1, something: 10 => result 10
arg: 2, something: 5 => result 10
如何确保任何不同的arg
和something
对的结果不同?
java中是否有数学函数或函数来执行此操作?
答案 0 :(得分:4)
我认为编程没有问题。相反,我认为你应该退后一步,尝试在数学水平上理解你的问题。考虑等式
(1) a * b = C
对于任何(任意选择的)C,a
,b
和C
为整数。
除非 a
和b
两个素数,否则至少会有一对其他a, b
也满足等式。如果你想一下这个证据就很简单了:
假设a
不是素数(b
不是素数的证明是相同的)。那么必须至少有两个完整的数字p
和a'
(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
的限制,它会给出199
和arg
之间的值,所以它实际上不是你的问题的解决方案;我选择了这个数字,因为我们的十进制系统基本上这样工作:-)因此你已经知道了。)
最后,如此微不足道,以至于可能无法想到,请记住a * b = b * a
(乘法至少对我们整个,真实和非理性的数字是可交换的,还有一些我不敢提及的)。适用于您的问题:arg * something = something * arg
。当然,即使arg
和something
都是素数,这仍然是正确的。如果您交换arg
和something
的值,则不可避免地会得到相同的结果。对于你想要达到的目标,这可能是也可能是不可接受的。
答案 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;
}