我想计算(m,n)对的数量,其中GCD(m,n)= x,比如x = 1且1 <= m <= M = 10 ^ 5且1 <= n <= N = 10 ^ 5。
M和N将被给予
注意:我只想要可能的对数而不是对。
时间限制:5秒
下面的代码适用于小数字,但对于较大的代码,它会给我StackOverflowError
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.math.BigInteger;
public class TestClass{
static long M;
static long N;
static long totalCount = 1;
public static void main(String[] args) throws Exception{
M = 100000;
N = 2000;
findCoPrimes(2, 1);
findCoPrimes(3, 1);
System.out.println(totalCount);
}
public static void findCoPrimes(int m, int n){
if ((n > N) || (m > M)){
return;
}
if (n != m && m <= N){
totalCount++;
}
totalCount++;
findCoPrimes(2*m - n, m);
findCoPrimes(2*m + n, m);
findCoPrimes(m + 2*n, n);
}
}
有人可以帮助我将这个递归函数转换为迭代函数,以避免StackOverflow错误。
请帮我找到解决方法。还将考虑任何其他更好的方法。这个问题有一个提示 - 使用智能方法找到素因子,然后找到共素对的数量。蛮力不会工作。
答案 0 :(得分:2)
要转换为迭代函数,您可以创建用于模拟函数堆栈的堆栈对象。
使用堆栈对象将允许您将状态存储在堆中而不是堆栈usually set to 256K by default。
请参阅此处转换为迭代的一般方法:https://stackoverflow.com/a/159777/276949