【问题标题】:Error in C program to find integer triplets (x,y,z) such that n^x + n^y = n^z for given range of n在 C 程序中查找整数三元组 (x,y,z) 时出错,使得 n^x + n^y = n^z 对于给定的 n 范围
【发布时间】:2015-06-27 12:30:25
【问题描述】:

我想制作一个与 DEV-C++ 4.9.9.2 兼容的 C 程序来查找整数三元组 (x,y,z),这样对于任何整数 n 等式 n^x + n^y = n^z 都成立,其中 n[a,b] 范围内的任何整数. c 程序将只有 ab 的输入,并找到这些可能的三元组。

我编写的代码不起作用。它有什么错误?

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 新手。

【问题讨论】:

  • 你必须缩进代码使其可读,就像我做的那样,四个嵌套循环会很慢。
  • 谢谢。使用四个嵌套循环计算大约需要 5-6 分钟。我在这里使用 Pola sai ram 给出的代码。
  • 我不明白最后一个for 循环。您正在该循环的第二个语句中进行赋值(而不是比较)。这就是你想要的吗?

标签: c algorithm numbers number-theory


【解决方案1】:

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。

【讨论】:

    【解决方案2】:

    改变

      if (e = f) 
    

      if (e == f) 
    

    第一个将f 分配给e,为此类错误启用编译器警告。第二个将 LHS 等同于 RHS。

    其次,假设您的程序是蛮力的,即循环所有 xyz 的值,您可能需要更改此语句:

     for (z = a ; z = b ; z++) 
    

     for (z = a ; z < b ; z++) 
    

    【讨论】:

      【解决方案3】:

      您的实现是 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);
                  }
              }
          }
      }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-26
        • 1970-01-01
        • 1970-01-01
        • 2019-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多