單鏈表通過結構體表示
struct ListNode
{
int data;
ListNode* next;
ListNode(int data) {
this->data = data;
this->next = nullptr;
}
};
typedef ListNode* List;
大數階乘的函數
思路:鏈表的每一個結點存儲一個3位數的值,每次從頭結點開始進位與計算,其他的和乘法一樣,最後處理結果時,如果某一結點的值不是三位數需要在前面補0補成三位數
string Solution::bigNumFactorial(int n)
{
string result = "";
List num = new ListNode(n);
List temp;
while (n >= 2) { // n = 2 之後進入循環只需要處理進位就行了
n--;
// 調整進位
temp = num;
while (temp != nullptr) {
if (temp->data > 999) {
if (temp->next == nullptr) {
temp->next = new ListNode(temp->data / 1000);
}
else {
temp->next->data += temp->data / 1000;
}
temp->data = temp->data % 1000;
}
temp = temp->next;
}
temp = num;
// 進行計算
while (temp != nullptr) {
temp->data *= n;
temp = temp->next;
}
}
string tempStr;
while (num != nullptr) {
tempStr = to_string(num->data);
// 如果不到三位數就補0
while (tempStr.size() < 3) {
tempStr = "0" + tempStr;
}
result = tempStr + result;
num = num->next;
}
// 去掉結果最前面的0
while (result[0] == '0') {
result .erase(result.begin());
}
return result;
}