我想让一个与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的新手!
答案 0 :(得分:3)
尝试更改
if (e=f)
到
if (e==f)
第一个完成任务,第二个测试相等。
(请注意,如果测试的数字大于您的数据类型,您也可能会溢出。)
如果y == x,那么:
n^x + n^x = n^z
2n^x = n^z
=> n == 0 or n == 2
现在,假设y&gt; 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。
答案 1 :(得分: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++)
答案 2 :(得分:0)
你的实现是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);
}
}
}
}
}