版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、DH算法的C語言實現(xiàn)1. class SuperNumber 2. public:3. SuperNumber() 4. memset(data, 0, MAX_SIZE);5. high = 0;6. 7.
2、0; / 一般整型到SuperNumber的轉(zhuǎn)換,該版本中不支持負數(shù)8. SuperNumber(unsigned long l) 9. memset(data, 0, MAX_SIZE);10. high = 0;11.
3、; while(l) 12. data+high = l % 10;13. l /= 10;14.
4、15. 16. / str為字符串形式表示的十進制數(shù)17. SuperNumber(const char* str) 18. assert(str != NULL);19. high =
5、0;strlen(str);20. for(int i = high, j = 0; i >= 1; i-, j+) 21. datai = strj - '0'22.
6、0; 23. 24. SuperNumber(const SuperNumber& s) 25. memcpy(data, s.data, MAX_SIZE);26. hi
7、gh = s.high;27. 28. operator const char*() const 29. return toString(10);30. 31. SuperNumber& operator=(const
8、60;SuperNumber& s) 32. if(this != &s) 33. memcpy(data, s.data, MAX_SIZE);34.
9、 high = s.high;35. 36. return *this;37. 38.39. / 將數(shù)據(jù)置為040. void reset() 41.
10、60; memset(data, 0, MAX_SIZE);42. high = 0;43. 44.45. / str為字符串形式表示的十進制數(shù)46. void setToStr(const char* str)
11、;47. assert(str != NULL);48. high = strlen(str);49. for(int i = high, j = 0; i >= 1;
12、0;i-, j+) 50. datai = strj - '0'51. 52. 53. / 將數(shù)據(jù)轉(zhuǎn)換成以base指定的進制的字符串形式,默認為十進制54.
13、0; const char* toString(int base = 10) const 55. static char bufMAX_SIZE;56. const char table = "0123456789ABCDEFGHIJKLMNOP
14、QRSTUVWXYZ"57.58. if(high = 0) return "0"59.60. assert(base >= 2); / 指定的進制應該不小于261.62.
15、; / 進制轉(zhuǎn)換63. bufMAX_SIZE-1 = '/0'64. int begin = MAX_SIZE-1;65. char tempMAX_SIZE;66.
16、; memcpy(temp, data, MAX_SIZE);67. while(1) 68. / 找最高位的起始位置69.
17、160; int h = high;70. while(temph = 0 && h >= 1) h-;71. if(h = 0) break;72.
18、73. / 除基取余74. int t = 0;75. while(h >= 1) 76.
19、 t = t * 10 + temph;77. temph = t / base;78.
20、160; t = t % base;79. h-;80. 81.
21、160; buf-begin = tablet;82. 83.84. return buf+begin;85. 86.87. / 乘法88.
22、 SuperNumber operator*(const SuperNumber& s) const 89. SuperNumber result; / default set to 090. i
23、nt i, j;91. 92. / 相乘93. for(i = 1; i <= high; i+) 94. &
24、#160; for(j = 1; j <= s.high; j+) 95. int k = datai * s.dataj + result.datai+j-1;96.
25、; result.datai+j-1 = k % 10;97. result.datai+j += k / 10;98.
26、160; 99. 100. / 進位101. for(i = 1; i < MAX_SIZE - 1; i+) 102. &
27、#160; if(result.datai >= 10) 103. result.datai+1 += result.datai / 10;104.
28、160; result.datai %= 10;105. 106. 107. / 確定最高位108. &
29、#160; for(i = MAX_SIZE-1; i >= 1 && result.datai = 0; i-);109. result.high = i;110.111. return resu
30、lt;112. 113.114. / 除法,內(nèi)部調(diào)用doDivide來實現(xiàn)115. SuperNumber operator/(const SuperNumber& s) const 116. SuperNumber q, r;117.
31、; doDivide(s, q, r);118. return q;119. 120. / 模運算,內(nèi)部調(diào)用doDivide來實現(xiàn)121. SuperNumber operator%(const SuperNumber& s
32、) const 122. SuperNumber q, r;123. doDivide(s, q, r);124. return r;125. 126.127.
33、0; / 除法運算,一次除法運算中同時得到商和余數(shù),運算符/和%的重載128. / 內(nèi)部會調(diào)用這個函數(shù),dest為除數(shù),Q為商,R為余數(shù),算法使用試除法129. void doDivide(const SuperNumber& dest, SuperNumber& Q, SuperNumber& R) const 130.
34、; int i, j, t;131.132. Q.reset();133. Q.high = high - dest.high + 1; / 商的初始位數(shù)134.
35、160; R = *this; / 余數(shù)初始實為被除數(shù)135. t = dest.high;136.
36、0;/ 判斷除法是否結(jié)束137. while(R >= dest) 138. / 循環(huán)相減進行試除139. while(dest >=
37、;R.sub(1, t) 140. Q.dataQ.high- = 0;141. +t;142.
38、60; 143. while(R.sub(1, t) >= dest) 144. / i為相減時被除數(shù)最低下標,j為除數(shù)最低下標145.
39、 for(i=R.high-t+1,j=1; j<=dest.high; i+,j+) 146. R.datai -= des
40、t.dataj;147. if(R.datai < 0) 148.
41、160; R.datai += 10;149. R.datai+1 -= 1;150.
42、60; 151. 152. while(R.datai < 0 && i
43、<= R.high) 153. R.datai += 10;154. R.
44、datai+1 -= 1;155. +i;156. 157. &
45、#160; Q.dataQ.high += 1;158. 159. / 一次試除結(jié)束,更新商的最高位下標160. &
46、#160; Q.high -= 1;161. / 更新被除數(shù)的最高位下標162. while(R.dataR.high = 0) 163.
47、60; R.high-;164. t-;165. 166. &
48、#160; t+=1; / 下一位被除數(shù)167. 168.169. Q.high = high - dest.high
49、160;+ 1; 170. while(Q.dataQ.high = 0) Q.high -= 1;171. R.high = high;172. while(R.dataR.high = 0)
50、0;R.high -= 1;173. 174.175. / 大數(shù)模冪算法,很簡單的自然算法,即將指數(shù)分解為二進制,換句176. / 更簡單的話來說,就是不斷地找平方模冪,而不是全部乘方后再177. / 做一次最終的模運算178. / a.power_mod(p, n)計算ap m
51、od n179. SuperNumber power_mod(int power, SuperNumber n) const 180. SuperNumber c("1"), t(*this);181.182. while(power) 1
52、83. if(power % 2) 184. c = c * t % n;185.
53、60; power -= 1;186. else 187. t = t * t
54、;% n;188. power /= 2;189. 190. 191.192.
55、; return c%n;193. 194.195. bool operator>=(const SuperNumber& s) const 196. if(high = s.high) 197.
56、 int k = high;198. while(datak = s.datak && k >= 1)k-;199. if(k
57、160;< 1) return true; / equal200. return datak > s.datak;201. else if(high > s.high) return true;202
58、. return false; 203. 204.205. bool operator<(const SuperNumber& s) const 206.
59、 return !(*this >= s);207. 208.209. / 從十進制表示的最高位開始數(shù)起,數(shù)到第i位,從第i位開始截取連續(xù)210. / 的c位數(shù)字出來組成一個新的數(shù)。例如:數(shù)據(jù)是,則211. / sub(3, 5)返回數(shù)字34567,如果數(shù)字不夠取,例如在34567上運行212.
60、 / sub(3, 5),因為34567從高位數(shù)起第3個數(shù)字是5,剩下的數(shù)字是567,213. / 最多只有三個,不夠取要求的5個,這個時候返回567,不報錯。214. SuperNumber sub(int i, int c) const 215. SuperNumber ret;2
61、16. assert(high >= i); / 保證可截取217.218. i = high - i + 1; / 從高位數(shù)起的第i個數(shù)位的下標219.
62、60; if(i >= c) 220. ret.high = c;221. while(c >= 1) ret.datac- = datai-;222.
63、 else 223. ret.high = i;224. while(i >= 1) 225.
64、0; ret.datai = datai;226. i-;227. 228.
65、 229. / 過濾前導0230. while(ret.dataret.high = 0) ret.high-;231. return ret;232. 2
66、33.234. / I/O235. friend istream& operator>>(istream& in, SuperNumber& s) 236. char t256;237. in
67、160;>> t;238. s.setToStr(t);239. return in;240. 241. friend ostream& operator<<(ostream& out, const S
68、uperNumber& s) 242. return out << s.toString(10);243. 244. private:245. enum MAX_SIZE=256; / 最大十進制位數(shù)246. &
69、#160; / 須注意,使用data0存儲最高位所在下標是自己的一點小聰明,后來在247. / 調(diào)試的時候發(fā)現(xiàn)這是一個極大的錯誤,不過對于此題目來說可以應付248. char dataMAX_SIZE; / 數(shù)據(jù)的內(nèi)部表示,字符串形式的十進制249.
70、 / 其中data0存儲最高位所在下標,data1250.
71、160; / 存儲數(shù)據(jù)的最低位,也就是個位251. int high;252. ;主函數(shù):1. int main(int argc, char *argv) 2. freopen("in.txt", "r", stdin);3.4. SuperNumberTest st;5.6. / st.run();7.8. / g和n都是超過2127的素數(shù)。它們在DH算法中公開9. SuperNumber g,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版國有企業(yè)員工退休福利待遇合同3篇
- 二零二五年度消防設備租賃合同書范例2篇
- 2024版電子商務物流合作協(xié)議書
- 二零二五年度融資租賃合同標的及租金支付安排5篇
- 2024版煤炭交易免開票協(xié)議范本版B版
- 2024版果園租賃合同協(xié)議書
- 二零二五年度變壓器租賃與電力設施節(jié)能改造協(xié)議3篇
- 2024版洛陽房屋租賃合同
- 二零二五年度二手房買賣合同含裝修質(zhì)量標準3篇
- 汽車租賃合同(公司向個人租車)
- 醫(yī)院三基考核試題(康復理療科)
- 2024-2030年中國招標代理行業(yè)深度分析及發(fā)展前景與發(fā)展戰(zhàn)略研究報告
- (新版)吉林一級健康管理師高頻核心題庫300題(含答案)
- JT-T-1344-2020純電動汽車維護、檢測、診斷技術規(guī)范
- 2024年湖北省武漢市中考語文試卷真題(含答案)
- 基因突變和基因重組(第1課時)高一下學期生物人教版(2019)必修2
- 天津市八校2023-2024學年高三年級下冊聯(lián)合模擬考試數(shù)學試題(二)(含答案解析)
- 納米技術增強早期疾病生物標志物的檢測
- 產(chǎn)品銷量分析表折線圖excel模板
- 辦公設備(電腦、一體機、投影機等)采購 投標方案(技術方案)
- 【真題】2023年南京市中考語文試卷(含答案解析)
評論
0/150
提交評論