鍊錶的十進位制加法

2021-07-15 04:31:53 字數 2101 閱讀 9654

題目:給定兩個用鍊錶表示的整數,每個結點包含乙個數字。這些數字是反向存放的,也就是個位排在鍊錶首部。編寫函式對這兩個整數求和,並用鍊錶形式返回結果。

示例 輸入:(7->1->6) +(5->9->2),即617+295

輸出:2->1->9,即912。

高階 假設這些數字是正向存放的,請再做一遍。

示例 輸入:(6->1->7) + (2->9->5),即617+295.

輸出:9->1->2,即912。

先考慮前乙個問題,由於鍊錶是從低位開始的,所以可以直接相加儲存進製。但是需要注意兩個鍊錶的長度可能不相等。如果不使用額外的記憶體空間,可以把結果儲存在較長的鍊錶中,如果確定儲存在第乙個鍊錶中,那麼需要記錄上一次相加的結點。因為當第乙個鍊錶已經走完而第二個鍊錶還沒有結束時,可以將第乙個鍊錶的上乙個結點(即最後乙個結點)指向第二個鍊錶,後面的相加結果儲存在第二個鍊錶中。

listnode* listadd(listnode* phead1, listnode* phead2)

else

carry = 0;

listend = node1;

node1 = node1->m_pnext;

node2 = node2->m_pnext;

} else

else

carry = 0;

listend = node2;

node2 = node2->m_pnext;

}else

else

carry = 0;

listend = node1;

node1 = node1->m_pnext;

}} }

if(carry != 0)

return phead1;

}

可以看到上面的方法實在過於繁瑣,不使用輔助空間而且不用遞迴就得在**複雜度上做出犧牲,下面利用遞迴並且允許新建鍊錶儲存結果的情況下,**精簡很多。

listnode* addcore(listnode* node1, listnode* node2, int carry)

listnode* listadd(listnode* phead1, listnode* phead2)

下面分析第二個問題,由於第二個問題中的鍊錶只是前面問題中的鍊錶的反序,因此可以將鍊錶反轉,利用前面的演算法,最後求得的結果仍然是反序的,再反轉結果,最後就是問題的正向解。

listnode* addcore(listnode* node1, listnode* node2, int carry)

listnode* reverselistadd(listnode* phead1, listnode* phead2)

listnode* reverselist(listnode* phead)

return prev;

}listnode* forwardlistadd(listnode* phead1, listnode* phead2)

如果不利用前面一問的結果,正向的鍊錶相加也是可以解的。從鍊錶的前面結點開始相加,由於前面結點代表高位,它需要低位結點相加的進製,但是低位結點不可能先於高位結點訪問到,這時候就需要用遞迴的辦法了,通過遞迴巢狀出低位來額進製,實際上還是從低位開始先加。同樣需要注意鍊錶不等長的問題,如果直接從高位往低位遞迴,就出現了錯位問題,譬如不同表長的兩個鍊錶首結點代表的權值是不同的,不應該由他們倆相加。這是後可以考慮在較短鍊錶的前面補零的辦法,使兩個鍊錶等長。

int addnodes(listnode* node1, listnode* node2)

else

return 0;

}listnode* addcore(listnode* phead1, listnode* phead2)

else

return phead1;

}listnode* forwardlistadd(listnode** phead1, listnode** phead2)

else

} }

return addcore(*phead1, *phead2);

}

高精度的十進位制加法

include include include using namespace std void sub const char big,const char small,char result void reverse str char str void two positive add const...

二十進位制的加法

題目描述 在二十進位制中,我們除了使用數字0 9以外,還使用字母a j 表示10 19 給定兩個二十進位制整數,求它們的和。輸入是兩個二十進位制整數,且都大於0,不超過100位 輸出是它們的和 二十進位制 且不包含首0。我們用字串來表示二十進位制整數。分析 在第一眼看到這道題的時候,我相信你也會有乙...

二十進位制數的加法

題目詳情 在二十進位制中,我們除了使用數字0 9以外,還使用字母a j 表示10 19 給定兩個二十進位制整數,求它們的和。輸入是兩個二十進位制整數,且都大於0,不超過100位 輸出是它們的和 二十進位制 且不包含首0。我們用字串來表示二十進位制整數。class program 二十進位制相加 字串...