所以我最近几天一直试图解决这个问题但没有运气。我的任务是找到从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:
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:
2 2 4 0
答案 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+q
和a = 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库