一般情況下,整形資料佔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夜,輪船勻速航 行,...