寻找不可减少的部分

时间:2016-08-19 17:11:39

标签: java algorithm performance math

给定一个正整数n,系统会要求您找到一个可以从集合A中选择两个数字B[1...n]的概率,以便{ {1}} GCDA {1}}为B。所以我的方法是计算对的数量,使得一个可被另一个整除。并且答案预计是以不可简化的分数形式 实例:
B
OUTPUT:
1 2 3

1/1 3/4 5/9

我的long n = sc.nextLong(); long sum=0; for(long i=1;i<=n/2;i++) sum+=(n/i)-1; long tot = n*n; sum+=n; long bro = hcf(tot,sum); sum/=bro; tot/=bro; System.out.print(sum+"/"+tot); 功能是:

hcf

但是编译器消息超时了。我认为public static long hcf(long n1,long n2) { if (n2!=0) return hcf(n2, n1%n2); else return n1; } 函数可能存在一些问题,或者有一种更好,更有效的方法来查找不可约分数。由于它对于较小的输入是成功的,我认为最有可能找到不可简化的分数形式的有效方法。有什么建议吗?

1 个答案:

答案 0 :(得分:3)

您的hcf功能不是太慢。相反,问题是你有一个for循环,迭代O(n)次,这在n = 10^9时非常多。您只需计算O(sqrt(n))的情况,即可将其降至B <= sqrt(A)。这将为您提供大约一半的案例,因为通常BA/B中只有一个小于sqrt(A)。唯一的例外是您必须考虑B * B = A的情况。