问题:给定A,B打印对数(a,b),使得GCD(a,b)= 1且1 <= a <= A且1 <= b <1。 = B
解决方案(蛮力方法) 在下面的代码中,我使用了暴力方法,它工作正常。然而,如果A&amp; A的执行时间超过10秒。 B> 10 ^ 5
替代解决方案 根据我的研究,我发现找到A&amp;的主要因素。 B将大大缩短执行时间(<3秒),但我不确定如何应用它。
需要帮助: 任何人都可以帮助我用&lt; 3秒执行时间?
class GCD {
public static void main(String[] args) {
int A = 0, B = 0, GCD = 0, count = 0;
BigInteger B1, B2 = null;
A = Integer.parseInt(args[0]);
B = Integer.parseInt(args[1]);
for (int a = 1; a <= A; a++) {
for (int b = 1; b <= B; b++) {
B1 = BigInteger.valueOf(a);
B2 = BigInteger.valueOf(b);
GCD = calculateGCD(B1, B2);
if (GCD == 1) {
count++;
}
}
}
System.out.println(count);
}
public static int calculateGCD(BigInteger number1, BigInteger number2) {
return (number1.gcd(number2)).intValue();
}
}
答案 0 :(得分:0)
我不想写一个完整的程序或其他东西,但我想给你一些加速程序的技巧:
gcd(a,b) = gcd(b,a)
所以只计算(a, b)
对a < b
。 gcd(a,a) = 1
仅适用于a = 1
。所有gcd(1,b) = 1
也b
,因此您可以从a = 2
和count = 1 + 2*(B-1)
开始。1 < a <= A
的所有素数因子。例如。每个数字都包含primefactor 2,每三个都包含一个因子3。a
包含不同的基元p
和q
。然后你知道:
B-a
个数字。 p
- 数字也包含原始因子p
,每个q
- 首要数字也包含原始因子q
。 floor( (B-a)/p )
个数字包含gcd >= p
,floor( (B-a)/q )
个数字包含gcd >= q
和floor( (B-a)/(p*q) )
个数字,您计算过两次。因此,您可以获得(a,b)
对a < b
的对数
(B-a) - floor( (B-a)/p ) - floor( (B-a)/q ) + floor( (B-a)/(p*q) )
i
(for-loop counter)被a
我认为这应该可以加快您的计划速度,只需要达到不到一秒钟。