如何在C ++中重复添加两个数组?

时间:2017-10-18 03:34:43

标签: c++ arrays

#include <iostream>
using namespace std;

int main() {

int a = 4;
int b = 2;
int result = 0;

for (int i = 0; i < a; i++)
{
    result += b;
}

return 0;
}

所以我理解这是重复添加的工作原理。我的问题是如何将其应用于添加2个数组?

我想要添加的数组包含4个元素,分别是0和1(二进制转换项目)。简单的答案是在得到它们的十进制值之后将两者相乘并且它以这种方式工作但是我需要通过for循环使用重复添加。

我的想法是在for循环中嵌入一个for循环,就像这样

Nibble ans;

for (int i = 3; i >= 0; i--)
    for (int j = 0; j < r.digits[i]; j++) //This part is what I'm not sure about
        ans.digits[i] += r.digits[i];
return ans;

这没用,所以任何人都可以告诉我,我是否朝着正确的方向前进?另外为什么有人会重复添加而不是仅仅乘以?

谢谢!

编辑:这是我如何添加我试图乘以重复添加的两个数组。

Nibble ans;

for (int i = 3; i >= 0; i--)
    ans.digits[i] = digits[i] + r.digits[i];


return ans;

1 个答案:

答案 0 :(得分:0)

  

如何将其应用于添加2个数组?

你的添加逻辑是正确的方向,但仍然太简单了。当每个地方值溢出时,您需要适应携带。你知道吗,就像你将一位数字加在一起得到2位数字(例如5 + 5 = 10)一样?你的代码不能这样做,而且它是加法和乘法的必要部分。

在您的附加代码中注意您如何拥有所有三个组件:结果(ans.digits)和两个操作数:digitsr.digits

for (int i = 3; i >= 0; i--)
    ans.digits[i] = digits[i] + r.digits[i];
for (int j = 0; j < r.digits[i]; j++) //This part is what I'm not sure about
    ans.digits[i] += r.digits[i];
     

这没有用,所以任何人都可以告诉我,我是否朝着正确的方向前进?

正如我之前提到的,你已经误入了一点点;首先,您需要修复添加代码,然后您应该在乘法代码中重用。这对你来说会更有效率(因为你不必测试两批加法代码应该是相同的)和你的计算机(因为它不会有你的重复的代码,除非它决定使用重复的代码是最佳的。)

在基本乘法中,就像加法一样,我们有三个组件。我们有两个因素和一个结果:ans.digits = r.digits * ???,例如,ans.digits是结果,因素是r.digits???。但是,在您的代码中,您只有一个因子和结果;您只提供了逻辑两个组件

您在控制循环和结果添加中都使用r.digits[i],因为这些应使用不同的组件。你基本上尝试了一个看似平方的操作,虽然平方是乘法,但你不是平方,对吧?在您的问题中,您提到您正在将两个数组相乘。您需要将两个数组与 answer 数组区分开来。您还需要更正

  

为什么有人会重复添加而不是仅仅相乘?

这是锻炼学生用编程语言表达逻辑能力,同时修改基本算术的好方法。

显然,如果所有学生都可以通过快速傅里叶变换或通过平方取幂来执行长除法,那么它是理想的,但在实践中你需要回到基础。你可能最终会通过重复减法来进行长时间的划分,最初也是这样,在您决定方式对你的喜好太慢之前并开始尝试你自己的自制FFT

这是我的添加代码的样子;它的JS并且超越了二进制,因此你无法用它来欺骗,但它可能会给你一些思考的食物。

Array.prototype.inc = function(number)
{ number = [].from_number(number);
  for (var x = 0; x < number.length; x++)
  { var y = x, carry = number[y];
    do
    { if (this.length <= y) this.push(carry & 0xFF);
      else carry += this[y] || 0, this[y++] = carry & 0xFF;
    } while (carry >>= 8);
  }
  return this;
}

我使用结果,好像它也是第一个操作数。这对于添加是可以接受的,但是当你进行相乘时,你不想改变任何一个操作数,因为你需要 next 的那些操作数此外。

您会注意到进位变量。我使用little-endian(最低字节优先)表示,所以我从左到右(或者说更低的索引到更高的索引)而不是传统的从右到左。因此,[0x80].inc([0x80])对我来说会产生[0x00,0x01],这对人类来说是违反直觉的,但允许我的数字在转换或添加过程中增大和缩小,而不必移动数字。这很好。

如果你想模仿一个更熟悉那些按重要性从左到右读取数字的人的表示,你会想要从右到左,而不是从右到左。我想在我的代码的情况下,这意味着使用y--而不是y++,尽管我对这种想法并不感兴趣。