找到特定的正整数

时间:2016-03-11 16:33:08

标签: java

我想找到整数n,这样当1 / z + 1 / x = 1 / n时有1000种组合。这是我的代码:

int counter = 0;
    double n = 1;

    while (true) {
        for (double i = 1; i < 10000; i++) {
            for (double t = 1; t < 10000; t++) {
                if ((1/i) + (1/t) == (1/n)) {                       
                    counter++;
                    System.out.println(counter);
                }
            }           
        }   
        if (counter < 1000) {
            counter = 0;
            n++;
        } else {
            System.out.println("Counterr: " + counter);
            System.out.println("Answer: " + n);
            System.exit(0);
        } 
    } 

如果我试图找到4种组合,它会起作用,但不会在1000时发生。为什么?

3 个答案:

答案 0 :(得分:0)

这可能是因为浮点精度问题。您在循环中对double使用增量++运算符,并将双精度数与==进行比较。这些操作的结果可能不如预期,特别是在多次迭代之后。

尝试更改代码以使用精确精确的整数,而不是双精度。请注意你的等式

  

1 / z + 1 / x = 1 / n

相当于

  

n *(x + z)= x * z

所以,按如下方式更改循环:

    for (int i = 1; i < 10000; i++) {
        for (int t = 1; t < 10000; t++) {
            if (n * (i + t) == i * t) {
                counter++;
                System.out.println(counter);
            }
        }           
    }

此外,现在更清楚如何优化迭代范围。考虑it的下限和上限 - 减少迭代范围将显着提高整体性能。

不幸的是,我目前还没有对结果进行测试,但我很确定你应该用整数进行计算,而不是用双精度计算。

答案 1 :(得分:-1)

您没有提供Netbeans中弹出的错误代码。但我假设有一个outofbounds错误。或异常错误。它找不到1000,因为你的while循环是无限的。当“组合”达到1000

时,您必须能够停止循环

答案 2 :(得分:-1)

尝试在内部循环中使用比10000更高的数字来增加搜索空间。也许9999999

我认为,对于使用1/z + 1/x = 1/n的同一n,您发现{z,x,n} in [1...10000]的1000种组合的可能性极小。

编辑。

int counter = 0;
    double n = 1;
    double maxiter = 1000*1000;
    double i,t;
    while (true) {
        for (i = 1; i < 10000; i++) {
            for (t = 1; t < 10000; t++) {
                if ((1/i) + (1/t) == (1/n)) {                       
                    counter++;
                    System.out.println(counter);
                }
            }           
        }
        if (i*t == maxiter) break; 
        if (counter < 1000) {
            counter = 0;
            n++;
        } else {
            System.out.println("Counterr: " + counter);
            System.out.println("Answer: " + n);
            System.exit(0);
        } 
    }