如何使用C中的循环查找满足(x-y * sqrt(2016.0))/(y + sqrt(2016.0))= 2016的数字

时间:2017-10-18 12:05:43

标签: c loops mathematical-expressions

我试图找到符合条款的数字(x-y *√2016)/(y +√2016)= 2016。 数字x和y可以是有理数。

那是我已经尝试过的:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main() {
int x, y;
    for(x = 1; x < 10000; x++) {
        for(y = 1; y < 10000; y++) {
            if( (x - y * sqrt(2016.0)) / (y + sqrt(2016.0) ) == 2016) {
                printf("Numbers are: %d and %d.", x, y);
            }
        }
    }
    return 0;
}

4 个答案:

答案 0 :(得分:2)

使用浮点数学和强力搜索来解决&#34;解决&#34;这个问题在概念上是一个坏主意。这是因为FP数学舍入误差以非直观的方式传播,因此许多在数学意义上可解的方程没有(精确的)具有FP数的解。因此,使用FP数学来逼近数学方程的解是很困难的。

我建议在编程之前简化问题。

如果一个人这样做并且只搜索整数解,那么就会发现唯一的解决方案是

x = -2016^2 = -4064256
y = -2016

原因:只需重新排列并获得

x = 2016*y + (2016 + y)*sqrt(2016)

由于sqrt(2016)不是整数,因此sqrt之前的子句中的项必须为零。其他一切都来自于此。

如果需要非整数解,可以使用上述方法找到每个y的x。甚至列举了所有解决方案。

因此,这表明在计算机中尝试求解之前简化数学问题通常是强制性的(尤其是FP数学)。

编辑:如果您查找有理数,则可以应用与整数情况相同的参数。由于sqrt(2016)不是有理数,y也必须是-2016。因此,对于理性情况,唯一的解决方案与整数相同,即

x = -2016^2 = -4064256
y = -2016

答案 1 :(得分:1)

这只是一条线的等式。这是一个确切的解决方案:

x = (sqrt(2016) + 2016)*y + 2016*sqrt(2016)

对于y的任何值,x由上面给出。 x截距是:

x = 2016*sqrt(2016)
y = 0

y-intercept是:

x = 0
y = -2016*sqrt(2016)/(sqrt(2016)+2016)

答案 2 :(得分:-1)

浮点运算的结果通常不准确。 变化:

if( (x - y * sqrt(2016.0)) / (y + sqrt(2016.0) ) == 2016) 

类似

if( fabs((x - y * sqrt(2016.0)) / (y + sqrt(2016.0) ) - 2016) < 0.00000001)

其中0.00000001是您选择的容差。

但正如所指出的那样,你不想在不必要的范围内搜索更多变量的域名。首先解决数学问题。使用Wolfram Alpha like this我们得到y =(x-24192 *√14)/(12 *(168 +√14))

答案 3 :(得分:-1)

  

满足的数字(x - y * sqrt(2016.0))/(y + sqrt(2016.0))= 2016

@Tom Karzes

开始
x = (sqrt(2016) + 2016)*y + 2016*sqrt(2016)

设y = -2016

x = (sqrt(2016) + 2016)*-2016 + 2016*sqrt(2016)
x = 2016*-2016 = -4064256

所以x,y = -4064256,-2016 是一个精确的解决方案。

有了数学,这是唯一的一个 由于sqrt(x)不完全是√x且double数学的特殊性,可能还有其他解决方案通过C代码模拟。

作为像OP这样的C模拟,让我们“猜测”答案的x,y都是2016年的倍数,可能是负数。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double f(int x, int y) {
  double z = (x - y * sqrt(2016.0)) / (y + sqrt(2016.0));
  z = z - 2016;
  return z * z;
}

#define M 3000
int main() {
  double best_diff = DBL_MAX;
  int best_x = 0;
  int best_y = 0;
  int x, y;
  for (x = -M; x < M; x++) {
    for (y = -M; y < M; y++) {
      double diff = f(x * 2016, y * 2016);
      if (diff < best_diff) {
        best_diff = diff;
        best_x = x;
        best_y = y;
      }
      if (diff == 0) {
        printf("Numbers are: %d and %d.\n",  best_x*2016, best_y*2016);
      }
    }
  }
  if (best_diff != 0.0) {
    printf("Numbers are: %d and %d --> %e.", best_x*2016, best_y*2016, best_diff);
  }
  return 0;
}

输出

Numbers are: -4064256 and -2016.