有效的方法来查找上限数字的gcd对,在java中为10000

时间:2013-09-27 14:58:59

标签: java

我想找到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);
        }
    }
}

2 个答案:

答案 0 :(得分:2)

其中许多问题已经解决了。

检查维基百科或其他来源的算法。

其中一个是the Euclidean algorithm

虽然存在更多

生成共素数(你似乎想要的)

This Should help

答案 1 :(得分:0)

  

生成所有互质对

     

所有互质数m,n都可以排列成一对不相交的完全   三元树,从(2,1)开始(偶数奇数或奇偶数对)   或者来自(3,1)(对于奇数对)。

     

每个顶点的子节点   (m,n)生成如下:

     

分支1:(2m-n,m)

     

分支2:(2m + n,m)

     

分支3:(m + 2n,n)

     

这个方案是详尽的,非冗余的,没有   无效的成员。

     

来自Wikipedia

这两个三元树很容易用Java构建(一个以(2,1)开头,另一个以(3,1)开头)。 您可以将上限放在生成函数中。

它比你的蛮力方法更有效率。