筆試真題 計算大位數的乘積

2021-07-10 18:57:35 字數 1983 閱讀 2469

一般情況下,整形資料佔4個位元組,其範圍在-32768-32767之間。當我們遇到兩個巨大的數的時候,直接利用整形來計算,往往無法滿足要求。例如計算:123456789與987654321。這裡便需要設計特定的演算法來計算兩個大位數的乘積。

演算法設計的大致思路為將兩個大位數看成兩個整形的陣列,即int bignum1[ ]和int bignum2[ ]。這裡為了方便計算直接使用int型,但為了節省空間,也可以宣告成char型別或short型別。再將bignum2裡的逐個元素與bignum2相乘,利用十進位制乘法的進製原理可以得到某單個元素bignum[i]與bignum1的乘積結果。最後將所有元素與bignum1的乘積結果求和即可。

例如:計算123456789*987654321

先用第二個大位數的最後一位1*123456789=123456789

再用第二個大位數的倒數第二位2*123456789=246913578

如此迴圈至第二個大位數的第一位9*123456789=1111111101

第二步求和

將上面的計算結果進行求和運算,則得出最後結果,但這裡要注意的是每一位都要與10的n次冪相乘,即:

sum = 123456789*10^0 + 246913578*10^1 + ... + 1111111101*10^8

整體演算法與我們傳統的筆算乘法步驟類似。

//乙個大位數與一位整數相乘

void product(short* num,short n,int len)

k--;

} delete temp;

}

再給出兩個大位數相加的演算法,其原理與大位數與一位數相乘的原理類似,也是需要注意滿十便需要往前進製,具體演算法如下。

//兩個大位數相加

void hugeplus(short* bignum1,short* bignum2,int len)

k--;

} delete temp;

}

最後給出兩個大位數相乘的演算法。

//兩個大位數相乘

void hugeproduct(short* bignum1,short* bignum2,short* result,int len)

k--;

} delete temp;

}//兩個大位數相加

void hugeplus(short* bignum1,short* bignum2,int len)

k--;

} delete temp;

}//兩個大位數相乘

void hugeproduct(short* bignum1,short* bignum2,short* result,int len)

}int _tmain(int argc, _tchar* argv)

{ while(1)

{ std::string numstr1,numstr2;

std::cout<>numstr1;

std::cout<>numstr2;

//為了節省空間,宣告為short型別

int len =numstr1.length() + numstr2.length();//總位數應該是位數較多的數再加1,加1的原因是相加時肯能進製,預留一位

short* num1 = new short[len];

short* num2 = new short[len];

short* result = new short[len];

//將字串轉換為陣列

美團筆試真題

下面哪種stl容器的實現和其它三個不一樣 a.set b.deque c.multimap d.map 答案 b 序列式容器 vector,list,deque 介面卡容器 stack,queue,優先佇列priority queue 關聯式容器 set,multiset,map,multimap,...

網易實習筆試真題C C

剛做的時候根本就沒有想到解題思路,剛好看到了別人的思路,自己寫了一下。裡面對unordered map及vector二維陣列的建立很靈活,另外區別了一下map,unordered map,hash map 但是沒有弄清楚unordered map,hash map的區別。以後遇到了在細細研究。另乙個...

名企筆試真題精選 (四)

哎,自己沒什麼時間也沒什麼耐性更沒什麼毅力天天學習天天向上,於是很多蒐羅來不及看的東東先分享給童鞋們吧 4.硬體巨頭 intel 筆試面試題目 1 智力題 1 每天中午從法國塞納河畔的勒阿佛有一艘輪船駛往美國紐約,在同一時 刻紐約也有一艘輪船駛往勒阿佛。已知橫渡一次的時間是7天7夜,輪船勻速航 行,...