




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、DH算法的C语言实现1. class SuperNumber 2. public:3. SuperNumber() 4. memset(data, 0, MAX_SIZE);5. high = 0;6. 7.
2、0; / 一般整型到SuperNumber的转换,该版本中不支持负数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为字符串形式表示的十进制数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. / 将数据置为040. void reset() 41.
10、60; memset(data, 0, MAX_SIZE);42. high = 0;43. 44.45. / str为字符串形式表示的十进制数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. / 将数据转换成以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、; / 进制转换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. / 除法,内部调用doDivide来实现115. SuperNumber operator/(const SuperNumber& s) const 116. SuperNumber q, r;117.
31、; doDivide(s, q, r);118. return q;119. 120. / 模运算,内部调用doDivide来实现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; / 除法运算,一次除法运算中同时得到商和余数,运算符/和%的重载128. / 内部会调用这个函数,dest为除数,Q为商,R为余数,算法使用试除法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; / 商的初始位数134.
35、160; R = *this; / 余数初始实为被除数135. t = dest.high;136.
36、0;/ 判断除法是否结束137. while(R >= dest) 138. / 循环相减进行试除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为相减时被除数最低下标,j为除数最低下标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. / 一次试除结束,更新商的最高位下标160. &
46、#160; Q.high -= 1;161. / 更新被除数的最高位下标162. while(R.dataR.high = 0) 163.
47、60; R.high-;164. t-;165. 166. &
48、#160; t+=1; / 下一位被除数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. / 大数模幂算法,很简单的自然算法,即将指数分解为二进制,换句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. / 从十进制表示的最高位开始数起,数到第i位,从第i位开始截取连续210. / 的c位数字出来组成一个新的数。例如:数据是,则211. / sub(3, 5)返回数字34567,如果数字不够取,例如在34567上运行212.
60、 / sub(3, 5),因为34567从高位数起第3个数字是5,剩下的数字是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; / 从高位数起的第i个数位的下标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; / 最大十进制位数246. &
69、#160; / 须注意,使用data0存储最高位所在下标是自己的一点小聪明,后来在247. / 调试的时候发现这是一个极大的错误,不过对于此题目来说可以应付248. char dataMAX_SIZE; / 数据的内部表示,字符串形式的十进制249.
70、 / 其中data0存储最高位所在下标,data1250.
71、160; / 存储数据的最低位,也就是个位251. int high;252. ;主函数: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的素数。它们在DH算法中公开9. SuperNumber g,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 金融科技在普惠金融中的金融科技创新趋势与挑战研究报告
- 高一化学教师教学工作总结
- 司炉工工作总结模版
- 文化产业园产业集聚与服务体系构建中的文化产业产业链协同效应报告
- 英语社团年度工作总结模版
- 教育行业招生营销数字化策略与教育改革策略报告2025
- 汽车共享出行平台运营模式创新与用户出行需求洞察报告
- 汽车维修厂总结模版
- 七年级生物下册知识点总结模版
- 新三板全国中小企业股份转让系统挂牌企业董监高任职资格总结模版
- 人教版数学六年级下册4.3.2图形的放大与缩小练习卷含答案
- 《教育系统重大事故隐患判定指南》解读
- 灌溉排水工程项目可行性研究报告编制
- 公益发展面试题及答案
- 解读2024 ESC急性肺血栓栓塞症诊断治疗指南
- T-CALC 007-2025 重症监护病房成人患者人文关怀规范
- 中学教育基础(上)知到课后答案智慧树章节测试答案2025年春陕西师范大学
- 金融数学考试及答案
- 婴幼儿物品消毒育婴师培训凌启课件
- 2025河北省安全员-C证(专职安全员)考试题库
- 湖南省张家界市慈利县实验高中-奋进关键期跨越分水岭-高二下开学家长会【课件】
评论
0/150
提交评论