【問題描述】
大數運算——計算n的階乘(n>=20)。
【基本要求】
(1)資料的表示和儲存;
(1.1)累積運算的中間結果和最終的計算結果的資料型別要求是整型——這是問題本身的要求;
(1.2)試設計合適的儲存結構,要求每個元素或結點最多儲存資料的3位數值。
(2)資料的操作及其實現:
基於設計的儲存結構實現乘法操作,要求從鍵盤上輸入n值;在螢幕上顯示最終計算結果。
【測試資料】
(1)n=20,n!=2432902008176640000
(2)n=30,n!=
265252859812191058636308480000000
【實現提示】
(1)設計資料的儲存結構:
介於階乘運算的精確性以及實型資料表示的不精確性,本題不能採用實型表示累積運算的中間結果和最終的計算結果,而只能用整型。然而由於普通整型和長整型所能表述數的範圍受其字長的限制,不能表示大數階乘的累積結果,故必須設計乙個合適的資料結構實現對資料的儲存,例如可以讓每個元素或結點儲存資料的若干位數值。
從問題描述不難看出n值為任意值,故為使程式盡量不受限制,應採用動態儲存結構。
(2)資料的操作及其實現:
(2.1)累積運算的特點是當前的計算結果是下次乘法運算的乘數;
(2.2)實現兩個數的乘法運算須考慮:
乘數的各位數都要與被乘數進行乘法運算;乘法過程中的進製問題及其實現;a因每個元素或結點最多儲存資料的3位數值,故當元素或結點中的數值大於
999,需向前乙個元素或結點進製。
(3)要求採用鏈式儲存結構實現(普通單鏈表,迴圈單鏈表,普通雙項鍊表和雙向迴圈鍊錶中任選一種結構)。
#include#include#includeusing namespace std;
/*第二題其實如果考慮雙向鍊錶儲存的話輸出會比較明了,
從前往後輸入,從後往前輸出。
但是因為有stringstream的存在,[注意輸出的時候要補0]
所以可以使得更加簡便
*/struct node
};node *root = new node(1);
void count(int i)
if (tmp != 0)//位數增加 }
int main()
string str = "";
while (root != null)
str = s + str;//在前面新增0
root = root->next;
} int ii = 0;
while (str[ii]=='0')
str = str.substr(ii);//去前導0
cout << str;
return 0;
}
大資料結構解析
結構大資料報括結構化 半結構化和非結構化資料,非結構化資料越來越成為資料的主要部分。據idc的調查報告顯示 企業中80 的資料都是非結構化資料,這些資料每年都按指數增長60 大資料就是網際網路發展到現今階段的一種表象或特徵而已,沒有必要神話它或對它保持敬畏之心,在以雲計算為代表的技術創新大幕的襯托下...
Java資料結構 大數相加
public class example3 2 if partialsum 10 else linkstack temp sa.isempty sa sb 引用指向加數和被加數中非空棧 while temp.isempty else else 如果在最後一次執行加法運算中,不需要進製 sum.pus...
N的階乘 大數階乘
輸入n求n的階乘的準確值。input 輸入n 1 n 10000 output 輸出n的階乘 首先,要確定n的階乘的數字大概有多少位,這樣便於我們去選擇合適的演算法。階乘 當n 10000時,上式值為35660 已經向上取整 所以接受 include include include include ...