【发布时间】:2017-10-24 18:19:35
【问题描述】:
我试图找到满足子句 (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;
}
【问题讨论】:
-
从表面上看,似乎没有问题;究竟是什么问题?
-
代码总体上看起来不错,但由于 sqrt(和浮点数学)并不精确,您可能需要考虑与较小的错误余量(例如
fabs((x - y * sqrt(2016.0)) / (y + sqrt(2016.0) ) - 2016) < 0.000001或其他一些任意余量)进行比较。 -
一些观察:(1)这是浮点数,所以你不太可能得到完全匹配。相反,您需要允许误差范围,(2)如果您可以足够接近函数接近线性的根,您可以开始将搜索空间划分为区间,依次缩小范围,(3)另一个方法是使用牛顿法。无论如何,您至少需要对所涉及的数学有所了解。
-
为什么不用数学来解决呢?每个 y ≠ −√2016 都有一个唯一的 x,这不是一个艰难的重新排列。
-
如果这是一项真正的任务,您应该首先求解一个变量的方程,即
x = 2060.9*y+90518.2。现在你可以通过简单地为 y 插入任意值来找到你的 x 和 y 对。
标签: c loops mathematical-expressions