应该制作一个程序,找出两个向量a =(a0,a1,...,an-1)和b =(b0,b1,...,bn-1)(1≤n≤ 20)是线性依赖的。输入应为n,如果向量与线性相关,则两个向量和输出的坐标应为1,否则为-0。
我现在已经在这方面挣扎了好几个小时,我什么都没有。我只知道基本的C ++内容,而且我的几何结构太糟糕了。如果有人给我写一个解决方案或者至少给我一些提示,我会非常感激。提前谢谢!
#include <iostream>
using namespace std;
int main()
{
int n;
double a[20], b[20];
cin >> n;
int counter = n;
bool flag = false;
for (int i = 0; i < n; i++)
{
cin >> a[i];
cin >> b[i];
}
double k;
for (int i = 0; i < n; i++)
{
for (k = 0; k < 1000; k = k + 0.01)
{
if (a[i] == b[i])
{
counter--;
}
}
}
if (counter == 0 && k != 0)
flag = true;
cout << flag;
return 0;
}
显然,我可能想出的就是这一切。 “for”循环在很多层面都是错误的,但我不知道如何解决它。我愿意接受建议。
答案 0 :(得分:2)
问题共有四个部分:
如果∃ k ,向量 a 和 b 是线性下降的。 a = k b 。这扩展到∃ k 。 Σ i = 1..n a i = ka i ,这是一组方程式中的任何一个都可以
所以你计算 k 为 b 0 / a 0 并检查相同的 k 适用于其他维度。
不要忘记处理 a 0 = 0(或小,见下文)。我可能会交换向量,因此较大的绝对值是分母。
由于精度有限,计算涉及舍入误差。你需要检查大致相等,而不是确切的,因为即使你期望它们,你很可能也不会得到确切的结果。
近似相等有两种形式,绝对(| x - y |&lt; ε)和相对(1 - ε&lt; | x / y |&lt; 1 +ε)。显然,亲戚在这里更有意义(你想忽略最后一个有效数字),但你必须再次处理价值太小的情况。
std::vector
。这样你就不会有任意限制。你有 k 的循环,但你不使用循环内的值。
带计数器的逻辑似乎没有任何意义。我甚至都看不到你想要达到的目标。
答案 1 :(得分:0)
你是对的,该代码根本没有对问题的依赖。
比你想象的更容易(至少在概念上)。通过另一个向量中的corressponding元素划分向量中的每个元素。如果所有这些除法产生相同的数,则向量是线性相关的。因此{ 1, 2, 4 }
和{ 3, 6, 12 }
是线性的,因为1/3 == 2/6 == 4/12
。
但是有两个技术问题。首先,您必须考虑当元素为零时会发生什么,您不希望除以零。
其次,因为您正在处理浮点数,所以测试两个数字是否相等是不够的。由于舍入错误,他们通常不会。所以你必须进行一些测试,看看两个数字是否接近相等。
我会让你考虑这两个问题。