方对号

时间:2017-10-17 01:33:32

标签: c++ loops math perfect-square

所以我最近几天一直试图解决这个问题但没有运气。我的任务是找到从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 <=数字)结束,我的num1s重复自己,num2s超过数字,并打印每个数字,直到它停止。

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

谢谢大家

编辑: 预期产量为12:

N P N + P P - 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:

N P N + P P - N

2 2 4 0

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

问题是你的双循环递增不正确。并且1201ProgramAlarm击败了我的拳头...... num2永远不会被重置为2,所以它不断增长。

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

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

答案 2 :(得分: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 

答案 3 :(得分: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库