C 程序在查找整数三元组 (x,y,z) 时出错,使得 n^x + n^y = n^z 对于给定的 n 范围
Error in C program to find integer triplets (x,y,z) such that n^x + n^y = n^z for given range of n
我想制作一个与 DEV-C++ 4.9.9.2 兼容的 C 程序来查找整数三元组 (x,y,z)
这样对于任何整数 n 等式 n^x + n^y = n^z
成立,其中 n
是[a,b]
范围内的任何整数。 c 程序将只有 a
和 b
的输入并找到这样可能的三元组。
我写的代码不工作。它有什么错误?
for (n = a ; n <= b ; n++) {
for (x = a ; x < b ; x++) {
for (y = a ; y < b ; y++) {
for (z = a ; z = b ; z++) {
c = pow(n, x);
d = pow(n, y);
e = pow(n, z);
f = c + d;
if (e = f) {
printf("(%d , %d , %d) : %d", x,y,z,n);
}
}
}
}
}
我是C的新手
C修正
尝试改变
if (e=f)
进入
if (e==f)
第一个做赋值,第二个测试相等性。
(请注意,如果测试的数字大于您的数据类型,您也可能会溢出。)
数学方法
如果 y==x,则:
n^x + n^x = n^z
2n^x = n^z
=> n == 0 or n == 2
现在,假设 y>x 且 n!=0。
n^x + n^y = n^z
n^x ( 1 + n^(y-x)) = n^z
=> 1+n^(y-x) = n^(z-x)
=> 1 = 0 ( modulo n)
=> impossible unless n==0 (in which case any x,y works) or n==1 (which does not work)
所以如果 n==0,这个方程对任何 x,y 都有解。
否则,唯一的解决方案是 n==2、x==y 和 z=x+1。
改变
if (e = f)
到
if (e == f)
第一个将 f
分配给 e
,为此类错误启用编译器警告。第二个将 LHS 等同于 RHS。
其次,假设您的程序是一个蛮力程序,即对 x
、y
和 z
的所有值进行循环,您可能需要更改此语句:
for (z = a ; z = b ; z++)
到
for (z = a ; z < b ; z++)
你的实现是 O(n^4) ,实际上它可以在 O(n^3) 内完成。这是代码
for (n = a ; n <= b ; n++) {
for (x = a ; x < b ; x++) {
for (y = a ; y < b ; y++) {
{
c = pow(n, x);
d = pow(n, y);
f = c + d;
e = pow(f,1.0/n);
if (e >= a && e < b) {
z = e;
printf("(%d , %d , %d) : %d", x,y,z,n);
}
}
}
}
}
我想制作一个与 DEV-C++ 4.9.9.2 兼容的 C 程序来查找整数三元组 (x,y,z)
这样对于任何整数 n 等式 n^x + n^y = n^z
成立,其中 n
是[a,b]
范围内的任何整数。 c 程序将只有 a
和 b
的输入并找到这样可能的三元组。
我写的代码不工作。它有什么错误?
for (n = a ; n <= b ; n++) {
for (x = a ; x < b ; x++) {
for (y = a ; y < b ; y++) {
for (z = a ; z = b ; z++) {
c = pow(n, x);
d = pow(n, y);
e = pow(n, z);
f = c + d;
if (e = f) {
printf("(%d , %d , %d) : %d", x,y,z,n);
}
}
}
}
}
我是C的新手
C修正
尝试改变
if (e=f)
进入
if (e==f)
第一个做赋值,第二个测试相等性。
(请注意,如果测试的数字大于您的数据类型,您也可能会溢出。)
数学方法
如果 y==x,则:
n^x + n^x = n^z
2n^x = n^z
=> n == 0 or n == 2
现在,假设 y>x 且 n!=0。
n^x + n^y = n^z
n^x ( 1 + n^(y-x)) = n^z
=> 1+n^(y-x) = n^(z-x)
=> 1 = 0 ( modulo n)
=> impossible unless n==0 (in which case any x,y works) or n==1 (which does not work)
所以如果 n==0,这个方程对任何 x,y 都有解。 否则,唯一的解决方案是 n==2、x==y 和 z=x+1。
改变
if (e = f)
到
if (e == f)
第一个将 f
分配给 e
,为此类错误启用编译器警告。第二个将 LHS 等同于 RHS。
其次,假设您的程序是一个蛮力程序,即对 x
、y
和 z
的所有值进行循环,您可能需要更改此语句:
for (z = a ; z = b ; z++)
到
for (z = a ; z < b ; z++)
你的实现是 O(n^4) ,实际上它可以在 O(n^3) 内完成。这是代码
for (n = a ; n <= b ; n++) {
for (x = a ; x < b ; x++) {
for (y = a ; y < b ; y++) {
{
c = pow(n, x);
d = pow(n, y);
f = c + d;
e = pow(f,1.0/n);
if (e >= a && e < b) {
z = e;
printf("(%d , %d , %d) : %d", x,y,z,n);
}
}
}
}
}