添加数字时如何处理结转?

时间:2012-11-27 07:17:13

标签: c# singly-linked-list

我正在处理一段C#代码,它添加了存储在单链表中的数字。我创建了一个包含11 11 8的缓冲区单链表。最终名单必须看起来像1 2 9。每个大于10的元素必须将转移传递给下一个数字,并且%10的结果将传递到将创建1 2 9的最终列表。 如何处理从左到右开始的每个数字的结转?

我创造了以下逻辑,但显然我忽略了一些东西。

 for (int i = 0; i < bufferList.Size(); i++)
 {
     int mostLeftValue = Convert.ToInt32(bufferList.GetValue(i));
     if (mostLeftValue >=10  && i + 1 < bufferList.Size())
     {
         int nextLeftValue = Convert.ToInt32(bufferList.GetValue(i + 1))+1;
         int modedNextValue = nextLeftValue % 10;
         finalList.InsertAtTail(modedNextValue);           
     }

     int moddedValue =  mostLeftValue %10 ;
     finalList.InsertAtFront(moddedValue);

1 个答案:

答案 0 :(得分:1)

看起来你不会将任何从一个值带到另一个值。此外,您正在添加输出列表的两端,这似乎是可疑的。

这是一个简单List<int>的实现 - 它基本上是你手动添加两个数字时所做的,只是没有实际添加。取当前数字,添加携带号码,存储“单位”,将“十位”带到下一栏。

Number      11   11    8
Carry        0 ┌─ 1 ┌─ 1 ┌─ 0
Sum         11 │ 12 │  9 │
Store        1 │  2 │  9 │  stop
Carry over  1 ─┘ 1 ─┘ 0 ─┘

您应该可以针对链接列表([i] -> .GetValue(i).Add -> .InsertAtTail.Count -> .Size()或类似名称)对其进行修改:

int carry = 0;
for (int i = 0; i < input.Count; i++)
{
    int sum = carry + input[i]; // add previous carry
    output.Add(sum % 10);       // store the "units"
    carry = sum / 10;           // carry the "tens"
}
while (carry > 0)               // anything left carried?
{
    output.Add(carry % 10);     // store the "units"
    carry = carry / 10;         // carry the "tens"
}