繁体   English   中英

使用类似堆栈的数组将两个数相加

[英]Adding two numbers using stack-like arrays

因此,例如,如果要添加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} 1,0,0,0 {1, 0, 0, 0} + {5}

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

反转数字,以使最低有效位在前,最高有效位在后。 加法算法的作用范围从最低到最高。

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}

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

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);
}

当然,它隐式地使用函数调用堆栈以及ab

我认为您最大的希望是这样的算法:

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 }

最低有效数字首先存储。 现在,您可以根据需要从堆栈的前端开始添加和携带。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM