-1

所以我最近几天一直在尝试这个问题,但没有运气。我的任务是找到从 1 到 x 的正方形对。

Num1 + Num2 = 完美平方(即 2 + 2 = 4. 16 + 20 = 36)

Num2 - Num1 = 一个完美的正方形。(即 2 - 2 = 0。20 - 16 = 4)

我已经越来越接近结果,但是对于我的生活来说,我无法弄清楚我的循环中出了什么问题。例如:这是我最新的方法:

测试一个数是否是完美平方的函数:

bool isSquare(int num){
    if(num < 0)
        return false;
    int root = round(sqrt(num));
    return num == root * root;
}

主要的:

int num1 = 1; num2 = 2;
int tempP, tempM;
for(int i = 1; i <= number; i++){
    for(int j = 1; j <= num1; j++){
        tempP = num1 + num2;
        tempM = num2 - num1;
        if(isSquare(tempP) && isSquare(tempM)){

            cout << num1 << "\t" << num2 << "\t" << tempP << "\t" << tempM << endl;
        }
        num2++;

    }
    num1++;
}

由于某种原因,我的输出(无论“int number”有多大)被限制为一行。我的其他测试(例如让第二个循环持续到 j <= number)以我的 num1s 重复自己、num2s 超过 number 并打印每个数字直到它停止而结束。

我不知道下一步该去哪里,任何指示都会有所帮助。

谢谢你们

编辑:12的预期输出:

NPN + PP - N

2 2 4 0
4 5 9 1
6 10 16 4
8 8 16 0
8 17 25 9
10 26 36 16
12 13 25 1
12 37 49 25

12的实际输出:

NPN + PP - N

2 2 4 0

4

4 回答 4

0

为避免暴力穷举搜索和平方性检查,您可以使用反向数学逻辑仅生成适当的对。让

a=num2
b=num1
a >= b > 0

众所周知

a + b = k^2
a - b = m^2

减去这些方程:

2 * b = k^2 - m^2 = (k-m) * (k+m)

我们可以看到 k 和 m 必须具有相同的奇数 - 都是偶数或都是奇数(并且 b 总是偶数)。

所以我们可以枚举k = 2, 3, 4..., 因为每个 k 都可能m = k-2, k-4, k-6...得到所有(a,b)对。

b = (k^2 - m^2) / 2
a = k^2 - b

k   m   b   a
2   0   2   2
3   1   4   5
4   0   8   8
4   2   6   10
5   1   12  13
5   3   8   17
6   0   18  18
6   2   16  20
6   4   10  26
...

另一种方法:枚举偶数 b,因为每个 b 生成 b/2 的所有因式分解为 2 个乘数 p 和 q ( b/2 = p * q, p >= q) 并计算和的可能变k=p+qa = k^2-b

b=24 的示例:

b/2 = 12
p   q   k   a
12  1   13  145 
6   2   8   40
4   3   7   25 
于 2017-10-17T06:12:51.827 回答
0

num2总是在增加。您需要在循环开始时(在开始循环之前)重置num2为适当的值。ij

于 2017-10-17T01:56:06.620 回答
0

问题是您的双循环不正确地递增。并且 1201ProgramAlarm 击败了我... num2 永远不会重置为 2,所以它一直在增长。

而是尝试使用第二个循环中的变量而不是 num2 ,看看会发生什么。

另外,注释掉或删除 num2++;

于 2017-10-17T02:01:08.460 回答
0

你的代码看起来很复杂,因为 i 和 j 无论如何都会随着 num1 和 num2 增加,那么为什么不将它们结合起来呢?

for (int N = 1; N <= number; N++)
    {
        for (int P = 0; P <= number; P++)
        {
            if (ceilf(sqrtf(N+P)) == sqrtf(N+P) && ceilf(sqrtf(P-N)) == sqrtf(P-N))
            {
                cout << left << setw(10) << N << setw(10) << P << setw(10) << P + N << setw(10) << P - N << endl;
            }
        }
    }

包括 cmath 库

于 2017-10-18T21:00:00.193 回答