2023年計算機等級二級C 輔導例項程式設計(10)

2022-04-08 11:34:48 字數 2290 閱讀 7852

大整數階乘的演算法思路

這裡的大整數指大於500以上的整數,當然更大也可以。由於整數階乘遞增的很快,遠大於指數式遞增,對於小整數,比如20,30左右,可以直接使用比如遞迴的方式進行,這很基本。

但是當整數較大時,階乘的結果很大,遠非乙個int或者long就能存的下的,比如1000的階乘結果有上千位。

所以大整數階乘設計的關鍵點就是儲存大整數,當選擇了儲存大整數,那麼整數的乘法運算也不能再依靠*了,所以還要重新設計大整數的懲罰運算。

上面是我的設計思路。網上找過相關的文章,有高手以4行**完成了該演算法,確實佩服!當然這涉及了演算法的優化,不管那麼多了,這裡要的就是以盡量清晰地思路快速設計該演算法,這是使用了stl標準庫的容器。

下面是我的演算法**,直接貼這裡了,注意看相關的注釋:

#include

#include

using namespace std;

// 傳入整數:int,和整數-1的階乘結果,進行相乘的結果

// 結構依然儲存到容器中

void calc(int num,vector &calcresult)

vector tempnum;

vector rest;

// 將傳入的int拆分之後儲存到容器中

dotempnum.push_back(num % 10);

num = num / 10;

} while (num);

// 將分拆之後的num進行乘法計算

unsigned int i = 0,j = 0;

for(i = 0;i < tempnum.size();++i)

int carry = 0;// 儲存每位計算時來自低位的進製

for(j = 0;j < calcresult.size();++j)

int bit1 = 0,bit2 = 0,res = 0;

bit1 = calcresult[j];

bit2 = tempnum[i];

res = bit1 * bit2;

// 儲存當前位

if((i+j)

// 臨時結果中有對應位存在,則直接更新

rest[i+j] += (res + carry) % 10;

else

// 沒有對應位則需要新增

rest.push_back((res+carry)%10);

// 有進製,則更新進製

carry = (res + carry) / 10;

// 如果計算之後還有最高位的進製,那麼則直接新增進去

if(carry)

// 儲存當前位

if((i+j)

// 臨時結果中有對應位存在,則直接更新

rest[i+j] += carry;

else

// 沒有對應位則需要新增

rest.push_back(carry);

// 上述計算之後,會出現有些位的數字超過了10,那是因為在處理每一位運算結果之後

// 相加時地位向高位可能存在進製,上面沒有考慮,所以需要進行調整

for(i = 0;i < rest.size();++i)

if(rest[i] > 9)

if((i+1) != rest.size())

// 高位存在,則直接更新高位

rest[i+1] += rest[i] / 10;

rest[i] = rest[i] % 10;

else

// 高位不存在,則需要插入

rest.push_back(rest[i] / 10);

rest[i] = rest[i] % 10;

// 將計算結果儲存到原來的容器中

calcresult.clear();

for(i = 0;i < rest.size();++i)

calcresult.push_back(rest[i]);

int main()

int num = 0;

vector calcresult;

// 將初值1賦進去

calcresult.push_back(1);

// 獲取欲求階乘的整數

cout<

cin>>num;

for(int i = 0;i < num;++i)

calc(i+1,calcresult);

// 輸出計算結果

cout<

for(unsigned int i = calcresult.size();i > 0 ;--i)

cout<

cout<

return 0;

2023年計算機等級考試二級 輔導講義(1)

c 氣泡排序基本應用技巧分享 對於學過c語言的朋友來說,可能對於裡面的氣泡排序還是有很深印象的。那麼今天我們將會為大家介紹一下具有c語言特性的c 語言中氣泡排序的實現方法。接下來就讓我們一起來看看c 氣泡排序的具體操作方法吧。c 氣泡排序 示例 include iostream.h include ...

2023年計算機等級考試二級 輔導講義(8)

c 過載型別轉換操作符 type cast operator boost ref和boost cref使用了過載 型別轉換 type cast 操作符來實現使用引用型別來替換模版引數,本文就介紹一下這種操作符的過載方法。函式原型 t1 operator t2 const t1的成員函式,過載 t2 ...

2023年計算機等級考試二級c語言上機題庫 十五

已知資料檔案in.dat中存有200個四位數,並已呼叫讀函式readdat 把這些數存入陣列a中,請考生編制一函式jsval 其功能是 若乙個四位數的千位數字上的值小於等於百位數字上的值,百位數字上的值小於等於十位數字上的值,以及十位數字上的值小於等於個位數字上的值,並且原四位數是偶數,則統計出滿足...