我试图找到符合条款的数字(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;
}
答案 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
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.