我在家庭作业中遇到过这个问题,我们必须在数字乘积(一个长数字)中找到给定数字(int)的指数。问题是,我们不允许使用BigInteger类。我尝试了两种方法,但都失败了:
我想存储给定数字(int-range)的素数因子分解,然后轻松检查长数列表中的素数出现。此方法适用于较小的数字,但接近2 ** 32的数字效率不高。
我查找了给定数字的gcd和列表中的每个数字,如果gcd除以给定数字,那么我将它们分开然后存储gcd,对下一个数字执行相同操作,找到gcd将它与前一个(可能是“剩余的”gcd)相乘,等等。这个方法失败了,因为当我寻找gcd时,我第50次只找到给定数字的因子,它的范围超出了长的范围。 / p>
有人可以就如何进行或如何解决这些障碍向我提出建议。
我在JAVA工作。
答案 0 :(得分:0)
嗯,这是基本的数学,但是让我们给你一个答案:
首先将小的给定数字分解,然后将其称为 a 。现在你有 a 作为素数因子(带有某种指数)。
现在你必须在大数字中找出这些素数的指数。因为它们是素数,你可以通过找到你所拥有的产品因子中的指数并将它们加在一起来做到这一点!
你会做这样的事情:
// input from previous step
int[] a_primes;
int[] a_exponents;
int[] factors_of_b;
// output to next step
int[] b_exponents = new int[a_primes.length];
for (int i = 0; i < b_exponents.length; i ++) {
b_exponents = 0
}
for (int factor : factors_of_b) {
for (int i; i < a_primes.length; i++) {
if (factor % a_primes[i] == 0) {
factor /= a_primes[i];
b_exponents[i]++;
}
}
}
在此之后,你有 b 中每个素数的指数,这也是一个。现在你只需要找出 b 的素数包含 a 的素数的次数。
为此,您需要进行最低限度的搜索:
// input from prevous step
int[] a_primes;
int[] a_exponents;
int[] b_exponents;
// final result
int result = b_exponents[0] / a_exponents[0];
for (int i = 0; i < a_primes.length; i++) {
int x = b_exponents[i] / a_exponents[i];
if (x < result) {
result = x;
}
}
你有它。这只是伪代码,没有完成错误检查,只是你清楚这个概念。