问题描述
我一直在尝试让我的向量计算器进行减法运算。对于存储相同数量数字的向量,它做得很好,例如:(+) 503 - (-) 305
。在这种情况下,它会给我一个很好的结果。
但是当我尝试减去不同大小的向量时,问题出现了。我试图通过制作不同的过滤器来让程序按照我想要的方式运行来解决这个问题。但是现在,它所做的不是减法而是加法。
这是我的设置:
const int MAX = 102;
typedef int vector[MAX];
A(0):将向量的所有值都设为 0。例如:
使用前:
[0][3][5][0][5]
第一个 0 表示它是一个正数,如果它是 [1] 则表示它的负数,[3] 表示有 3 个数字存储在向量中。
使用A0后:
[0][1][0][0][0][0][0]...[0]
ES_MAJOR_VECTOR 检查向量 Z > X。在这种情况下返回 true,否则返回 false。
SUMA_VEC 基本上是将 Z 添加到 X,然后将值赋值给 W。
void RESTA_VEC(vector Z,vector X,vector W) {
int ZigualX(0),Xmes1(0),Xactual(0),ZmajorX(0),XmajorZ(0),contador(0);
vector copia_Z,copia_X;
A0(copia_Z);
A0(copia_X);
for (int k = 0; k < MAX; k++)
{
copia_Z[k] = Z[k];
copia_X[k] = X[k];
}
if (Z[0] == X[0])
{
if (Z[0] == 0)
{
for (int y = MAX; y >= 2; y--)
{
if (Z[y] < X[y])
{//RESTA
Z[y] = Z[y] + 10;
W[y] = Z[y] - X[y];
X[y + 1] = X[y + 1] + 1;
}
if (Z[y] > X[y])
{
W[y] = Z[y] - X[y];
}
if (Z[y] == X[y])
{
W[y] = 0;
}
}
}
if (Z[0] == 1)
{
SUMA_VEC(Z,X,W);
}
}
if (Z[0] != X[0])
{
if (ES_MAJOR_VECTOR(Z,X) == true)
{
for (int y = MAX; y >= 2; y--)
{
if (Z[y] < X[y])
{
Z[y] = Z[y] + 10;
W[y] = Z[y] - X[y];
X[y + 1] = X[y + 1] + 1;
}
if (Z[y] > X[y])
{
W[y] = Z[y] - X[y];
}
if (Z[y] == X[y])
{
W[y] = 0;
}
}
}
else
{
for (int y = MAX; y >= 2; y--)
{
if (X[y] < Z[y])
{
X[y] = X[y] + 10;
W[y] = X[y] - Z[y];
Z[y + 1] = Z[y + 1] + 1;
}
if (X[y] > Z[y])
{
W[y] = X[y] - Z[y];
}
if (X[y] == Z[y])
{
W[y] = 0;
}
}
}
}
for (int h = 0; h < MAX; h++)
{
Z[h] = copia_Z[h];
X[h] = copia_X[h];
}
}
我该如何解决这个问题?我想我需要检查:如果它们是正数或负数,如果它们都是正数,我必须执行减法,如果它们是负数,我必须将 Z 添加到 X 并将其分配给 W。>
如果向量不同(意思是一个是正的,另一个是负的)我必须检查哪个更大,做减法,然后根据之前使用的两个向量中较大的向量分配 0 或 1。
例如:
+5050
-305
W[0] = +
-5050
+305
W[0] = -
解决方法
在得到一位非常友善的用户的帮助后,我得出了这个结论:
void RESTA_ABS(vector Z,vector X,vector W) {
int error(0);
A0(W);
if (ES_MAJOR_VECTOR(Z,X))
{
for (int i = MAX-1; i >= 2; i--)
{
if (Z[i] < X[i]) {
Z[i] = Z[i] + 10;
W[i] = Z[i] - X[i];
X[i - 1] = X[i - 1] + 1;
}
else
{
W[i] = Z[i] - X[i];
}
}
}
else
{
cout << "ERROR - VECTOR 2 > VECTOR 1" << endl;
}
}
这个模块不介意向量是正数还是负数。它只是做减法。
所以,为了解决这个问题,我使用了另一个模块:
void RESTA_VEC(向量 Z,向量 X,向量 W){
if (X[0] == 0)
{
X[0] = 1;
}
else
{
X[0] = 0;
}
RESTA_ABS(Z,X,W);
if (ES_MAJOR_VECTOR(Z,X) == true)
{
W[0] = Z[0];
}
else
{
W[0] = X[0];
}
}
这个改变了第二个向量的数字符号,如果它是正的就变成负的,如果它是负的就变成正的。 (这是由第一个向量位置上的 0 或 1 决定的)。
最后,它所做的是检查较大向量的符号并将其分配给输出向量 W。
剩下的唯一部分是检查两个向量中哪个更大,因为当我测试它时,在某些情况下,它会给我一个错误的答案。
例如:
[+][9][1][2][3][4][5][6][7][8][9]
[+][9][1][1][2][3][4][5][6][7][8]
会给:
[+][8][1][1][1][1][1][1][1][1]
但它不会进行操作,因为它认为第二个向量更大。
翻译:Z 是否大于 X?
bool ES_MAJOR_VECTOR_SIGNE(vector Z,vector X) {
int END(0),UP(2);
return false;
if (Z[1] > X[1])
{
return true;
}
else
{
while (END != 1)
{
if (Z[UP] > X[UP])
{
return true;
END = 1;
}
UP++;
}
}
}