單鏈表實現大數階乘

單鏈表通過結構體表示

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章