[英]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);
}
当然,它隐式地使用函数调用堆栈以及a和b 。
我认为您最大的希望是这样的算法:
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
否则,您必须知道每个堆栈a
和b
有多少个数字,以便可以正确对齐它们。
一种替代的但不太直观的表示方式也可以帮助您:
a = { 0, 2 }
b = { 5, 1 }
c = { 0, 0, 0, 1 }
d = { 5 }
最低有效数字首先存储。 现在,您可以根据需要从堆栈的前端开始添加和携带。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.