我想找到GCD = 1到一定数量的对,比如10000。 我使用2个嵌套循环并调用具有长参数的方法。 但代码运行缓慢,需要任何有效的方法。 感谢
class FastGCD {
public static long GCD(long a, long b) {
return (b == 0 ? a : GCD(b, a % b));
}
public static void main(String ah[]) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int cases = 0;
long number = 0, output = 0;
try {
cases = Integer.parseInt(br.readLine());
} catch (NumberFormatException e) {
System.exit(0);
} catch (IOException e) {
System.exit(0);
}
for (int i = 1; i <= cases; i++) {
try {
number = Long.parseLong(br.readLine());
} catch (NumberFormatException e) {
e.printStackTrace();
System.exit(0);
} catch (IOException e) {
e.printStackTrace();
System.exit(0);
}
for (int j = 0; j < number; j++) {
for (int k = 0; k < number; k++) {
if (FastGCD.GCD(j, k) == 1)
{
//System.out.println("here"+j+","+k);
output++;
}
}
}
System.out.println(output);
}
}
}
答案 0 :(得分:2)
答案 1 :(得分:0)
生成所有互质对
所有互质数m,n都可以排列成一对不相交的完全 三元树,从(2,1)开始(偶数奇数或奇偶数对) 或者来自(3,1)(对于奇数对)。
每个顶点的子节点 (m,n)生成如下:
分支1:(2m-n,m)
分支2:(2m + n,m)
分支3:(m + 2n,n)
这个方案是详尽的,非冗余的,没有 无效的成员。
这两个三元树很容易用Java构建(一个以(2,1)开头,另一个以(3,1)开头)。 您可以将上限放在生成函数中。
它比你的蛮力方法更有效率。