使用类似堆栈的数组添加两个数字

时间:2013-04-13 15:37:26

标签: c algorithm

例如,如果我想添加20 + 15,我需要有两个数组:

a = {2, 0}
b = {1, 5}

我应该得到以下数组作为结果:

outcome = {3, 5} // or {5, 3} and read it in reverse order

困难之处在于我只能使用这些数组的第一个元素,因此它们的行为类似于堆栈。

在我的例子中,它相对容易,但如果有像{1, 0, 0, 0} + {5}这样的数字怎么办?或{9, 9} + {9, 9}

我真的找不到一种具体的方法来做到这一点,更不用说我找不到任何解决方法{1, 0, 0, 0} + {5}

C标签在这里是因为我实际上需要用C语言编写这个东西,但是欢迎任何有关该解决方案的想法(我的意思是描述,不一定是C程序)。

3 个答案:

答案 0 :(得分:3)

反转数字,使最低有效数字为第一,最重要数字为最后数字。添加算法的工作从最小到最重要。

a = {0, 0, 0, 1}
b = {5}

现在添加这些数字应该很简单。从每个中弹出一个数字,添加它们,然后将结果推送到结果堆栈。

a = {9, 9}
b = {9, 9}

要处理99 + 99,您需要跟踪进位。这将是您存储的一个额外变量,它不会进入任何一个堆栈。弹出9和9,添加它们并获得18.将8推入结果堆栈并存储进位数。

a = {9}
b = {9}
outcome = {8}
carry = 1

现在弹出接下来的两位数字9和9,然后将它们添加到18中。添加进位数以获得19.将9推入结果堆栈并再次跟踪进位。

a = {}
b = {}
outcome = {9, 8}
carry = 1

现在输入堆栈上没有数字,所以最后将最后一个进位数字推到结果堆栈上。

outcome = {1, 9, 8}

答案 1 :(得分:1)

试试这个(未经测试)(更新以处理进位):

Stack Add(Stack a, Stack b, bool carry) {
  if (a.Empty && b.Empty) return (carry ? a.Push(1) : a);
  int c = (a.Empty ? 0 : a.Pop)
        + (b.Empty ? 0 : b.Pop)
        + (carry ? 1 : 0);
  if (c>=10) 
    return Add(a,b,true).Push(c-10)
  else
    return Add(a,b,false).Push(c);
}

当然,它隐含地使用函数调用堆栈以及 a b

答案 2 :(得分:1)

我认为你最好的希望是这样的算法:

pop digits from stack a and compute number n1
pop digits from stack b and compute number n2
add n1 and n2 giving n3
push digits from n3 onto stack outcome

如果失败,您必须知道每个堆栈中有多少位数ab,以便您可以正确对齐它们。

替代但不太直观的表示也可能有所帮助:

a = { 0, 2 }
b = { 5, 1 }

c = { 0, 0, 0, 1 }
d = { 5 }

首先存储最低有效数字。现在,您可以根据需要从堆叠的正面添加和携带。