超大数的java具体实现

Code:
  1. packagecom.bin.bigNumber;
  2. /**
  3. *Filename:BigNumber.java
  4. *Description:超大数(也即高精度运算问题)
  5. *@author胡海斌(<ahref="mailto:335855364@qq.com"title="联系我">HuHaibin</a>)
  6. *@versionV1.0
  7. *Createat:2010-12-11下午01:21:22
  8. *
  9. *ModificationHistory:
  10. *DateAuthorVersionDescription
  11. *--------------------------------------------
  12. *2010-12-11userName1.01.0version
  13. *
  14. */
  15. publicclassBigNumberimplementsComparable<BigNumber>
  16. {
  17. privatefinalStringdata;
  18. publicBigNumber()
  19. {
  20. super();
  21. data="";
  22. }
  23. publicBigNumber(Stringdata)
  24. {
  25. if(data==null)
  26. this.data="";
  27. else
  28. this.data=format(data);
  29. }
  30. /**
  31. *对字符串进行格式化,去掉前面出现的连续零
  32. *
  33. *@params
  34. *@return
  35. */
  36. privateStringformat(Strings)
  37. {
  38. if(s.equals("0"))
  39. returns;
  40. intn=0;
  41. byteb[]=s.getBytes();
  42. while(b[n]=='0')
  43. {
  44. n++;
  45. if(n==b.length)
  46. break;
  47. }
  48. if(n==b.length)
  49. return"0";
  50. returns.substring(n,s.length());
  51. }
  52. /**
  53. *加法运算
  54. *
  55. *@parama
  56. *@paramb
  57. *@return
  58. */
  59. publicstaticBigNumberadd(BigNumbera,BigNumberb)
  60. {
  61. if(!a.data.startsWith("-")&&!b.data.startsWith("-"))
  62. {//a不为负数,b不为负数
  63. Stringstr="";
  64. intm=a.data.length();
  65. intn=b.data.length();
  66. inttemp,oldTemp=0;
  67. if(m>=n)
  68. {
  69. for(inti=0;i<m;i++)
  70. {
  71. intj;
  72. if(i<n)
  73. j=Integer
  74. .parseInt(b.data.substring(n-i-1,n-i));
  75. else
  76. j=0;
  77. temp=Integer.parseInt(a.data.substring(m-i-1,m-i))
  78. +j+oldTemp/10;
  79. oldTemp=temp;
  80. str=temp%10+str;
  81. }
  82. str=oldTemp/10+str;
  83. }else
  84. {
  85. returnBigNumber.add(b,a);
  86. }
  87. returnnewBigNumber(str);
  88. }elseif(a.data.startsWith("-")&&b.data.startsWith("-"))
  89. {//a为负数,b为负数
  90. returnBigNumber.opposite(BigNumber.add(BigNumber.opposite(a),
  91. BigNumber.opposite(b)));
  92. }else
  93. {//a、b其一为负数,另一为正数或零
  94. if(a.data.equals("0"))
  95. {
  96. returnb;
  97. }elseif(b.data.equals("0"))
  98. {
  99. returna;
  100. }elseif(!a.data.startsWith("-")
  101. &&BigNumber.compare(a,BigNumber.opposite(b))==1)
  102. {
  103. returnBigNumber.subtract(a,BigNumber.opposite(b));
  104. }elseif(!a.data.startsWith("-")
  105. &&BigNumber.compare(a,BigNumber.opposite(b))==-1)
  106. {
  107. returnBigNumber.opposite(BigNumber.subtract(BigNumber
  108. .opposite(b),a));
  109. }elseif(a.data.startsWith("-")
  110. &&BigNumber.compare(BigNumber.opposite(a),b)==1)
  111. {
  112. returnBigNumber.opposite(BigNumber.subtract(BigNumber
  113. .opposite(a),b));
  114. }else
  115. //if(a.data.startsWith("-")&&BigNumber.compare(BigNumber.oppositeNumber(a),
  116. //b)==-1)
  117. {
  118. returnBigNumber.subtract(b,BigNumber.opposite(a));
  119. }
  120. }
  121. }
  122. /**
  123. *减法运算
  124. *
  125. *@parama
  126. *@paramb
  127. *@return
  128. */
  129. publicstaticBigNumbersubtract(BigNumbera,BigNumberb)
  130. {
  131. if(BigNumber.compare(a,b)==0)
  132. {//a、b相等
  133. returnnewBigNumber("0");
  134. }elseif(!a.data.startsWith("-")&&!b.data.startsWith("-"))
  135. {//a、b不为负
  136. if(BigNumber.compare(a,b)==1)
  137. {//a大于b
  138. if(b.data.equals("0"))
  139. returna;
  140. Stringstr="";
  141. inttemp,oldTemp=0;
  142. intm=a.data.length();
  143. intn=b.data.length();
  144. for(inti=0;i<m;i++)
  145. {
  146. intj;
  147. if(i<n)
  148. j=Integer
  149. .parseInt(b.data.substring(n-i-1,n-i));
  150. else
  151. j=0;
  152. temp=Integer.parseInt(a.data.substring(m-i-1,m-i))
  153. -j-oldTemp;
  154. oldTemp=temp<0?1:0;
  155. str=(temp+10)%10+str;
  156. }
  157. returnnewBigNumber(str);
  158. }else
  159. {//a小于b
  160. returnBigNumber.opposite(BigNumber.subtract(b,a));
  161. }
  162. }elseif(!a.data.startsWith("-")&&b.data.startsWith("-"))
  163. {//a为正数,b为负数
  164. returnBigNumber.add(a,BigNumber.opposite(b));
  165. }elseif(a.data.startsWith("-")&&!b.data.startsWith("-"))
  166. {//a为负数,b为正数
  167. returnBigNumber.opposite(BigNumber.add(BigNumber.opposite(a),b));
  168. }else
  169. {//a,b均为负数
  170. returnBigNumber.opposite(BigNumber.subtract(BigNumber.opposite(a),
  171. BigNumber.opposite(b)));
  172. }
  173. }
  174. /**
  175. *乘法运算
  176. *
  177. *@parama
  178. *@paramb
  179. *@return
  180. */
  181. publicstaticBigNumbermultiply(BigNumbera,BigNumberb)
  182. {
  183. if(BigNumber.compare(a,b)>=0)
  184. {
  185. if(a.data.equals("0")||b.data.equals("0"))
  186. returnnewBigNumber("0");
  187. intl=b.data.length();
  188. if(l==1)
  189. {
  190. BigNumberc=newBigNumber(a.data);
  191. for(BigNumbertemp=newBigNumber("1");BigNumber.compare(b,
  192. temp)>0;temp=BigNumber.add(temp,
  193. newBigNumber("1")))
  194. {
  195. c=BigNumber.add(c,a);
  196. }
  197. returnc;
  198. }else
  199. {
  200. BigNumbertempBigNumber,resultBigNumber=newBigNumber("0");
  201. for(inti=0;i<l;i++)
  202. {
  203. tempBigNumber=BigNumber.multiply(a,newBigNumber(b.data
  204. .substring(l-i-1,l-i)));
  205. Stringzero="";
  206. for(intj=0;j<i;j++)
  207. {
  208. zero+="0";
  209. }
  210. tempBigNumber=newBigNumber(tempBigNumber.data+zero);
  211. resultBigNumber=BigNumber.add(resultBigNumber,
  212. tempBigNumber);
  213. }
  214. returnresultBigNumber;
  215. }
  216. }else
  217. {
  218. returnBigNumber.multiply(b,a);
  219. }
  220. }
  221. publicstaticBigNumbermultiply(BigNumbera,intb)
  222. {
  223. returnmultiply(a,newBigNumber(b+""));
  224. }
  225. /**
  226. *除法运算
  227. *
  228. *@parama
  229. *@paramb
  230. *@return
  231. */
  232. publicstaticBigNumberdivide(BigNumbera,BigNumberb)
  233. {
  234. if(b.data.equals("0"))
  235. returnnewBigNumber();
  236. if(!a.data.startsWith("-")&&!b.data.startsWith("-"))
  237. {//a、b均不为负数
  238. if(BigNumber.compare(a,b)==-1)
  239. {
  240. returnnewBigNumber("0");
  241. }elseif(BigNumber.compare(a,b)==0)
  242. {
  243. returnnewBigNumber("1");
  244. }else
  245. {
  246. intm=a.data.length();
  247. intn=b.data.length();
  248. Stringstr="1";
  249. if(BigNumber.compare(newBigNumber(a.data.substring(0,n)),b)==-1)
  250. {
  251. for(inti=0;i<m-n-1;i++)
  252. {
  253. str+="0";
  254. }
  255. }else
  256. {
  257. for(inti=0;i<m-n;i++)
  258. {
  259. str+="0";
  260. }
  261. }
  262. for(inti=0;i<str.length();i++)
  263. {
  264. BigNumbertemp1=BigNumber.multiply(b,(int)Math.pow(10,
  265. str.length()-1-i));
  266. for(intj=0;j<9;j++)
  267. {
  268. BigNumbertemp2=BigNumber.subtract(a,BigNumber
  269. .multiply(b,newBigNumber(str)));
  270. if(BigNumber.compare(temp2,temp1)!=-1)
  271. {
  272. str=str.substring(0,i)
  273. +(Integer
  274. .parseInt(str.substring(i,i+1))+1)
  275. +str.substring(i+1,str.length());
  276. }else
  277. {
  278. break;
  279. }
  280. }
  281. }
  282. returnnewBigNumber(str);
  283. }
  284. }elseif(a.data.startsWith("-")&&b.data.startsWith("-"))
  285. {//a、b均为负数
  286. returnBigNumber.divide(BigNumber.opposite(a),BigNumber
  287. .opposite(b));
  288. }else
  289. {//a、b其一为负数,另一不为负数
  290. if(a.data.startsWith("-"))
  291. {
  292. returnBigNumber.opposite(BigNumber.divide(BigNumber
  293. .opposite(a),b));
  294. }else
  295. {
  296. returnBigNumber.opposite(BigNumber.divide(a,BigNumber
  297. .opposite(b)));
  298. }
  299. }
  300. }
  301. /**
  302. *比较两个大数a、b的大小
  303. *
  304. *@parama
  305. *大数
  306. *@paramb
  307. *大数
  308. *@return1、0、-11表示a大于b0表示a等于b-1表示a小于b
  309. */
  310. publicstaticintcompare(BigNumbera,BigNumberb)
  311. {
  312. if(!a.data.startsWith("-")&&b.data.startsWith("-"))
  313. {//a不为负数,b为负数
  314. return1;
  315. }elseif(a.data.startsWith("-")&&!b.data.startsWith("-"))
  316. {//a为负数,b不为负数
  317. return-1;
  318. }elseif(!a.data.startsWith("-")&&!b.data.startsWith("-"))
  319. {//a不为负数,b不为负数
  320. if(a.data.length()>b.data.length())
  321. {//a值长度大于b值长度
  322. return1;
  323. }elseif(a.data.length()<b.data.length())
  324. {//a值长度小于b值长度
  325. return-1;
  326. }else
  327. {//a值长度等于b值长度
  328. if(a.data.equals(b.data))
  329. {a值等于b值
  330. return0;
  331. }
  332. inti=0;
  333. bytem[]=a.data.getBytes();
  334. byten[]=b.data.getBytes();
  335. for(i=0;i<m.length;i++)
  336. {
  337. if(m[i]!=n[i])
  338. break;
  339. }
  340. if(m[i]>n[i])
  341. {
  342. return1;
  343. }else
  344. {
  345. return-1;
  346. }
  347. }
  348. }else
  349. {//a为负数,b为负数
  350. return-(BigNumber.compare(newBigNumber(a.data.substring(1,a.data
  351. .length())),newBigNumber(b.data.substring(1,b.data
  352. .length()))));
  353. }
  354. }
  355. publicintcompareTo(BigNumberb)
  356. {
  357. //TODOAuto-generatedmethodstub
  358. returnBigNumber.compare(this,b);
  359. }
  360. /**
  361. *求a的相反数
  362. *
  363. *@parama
  364. *@returna的相反数
  365. */
  366. publicstaticBigNumberopposite(BigNumbera)
  367. {
  368. BigNumberzero=newBigNumber("0");
  369. if(BigNumber.compare(a,zero)==1)
  370. {
  371. returnnewBigNumber("-"+a.data);
  372. }elseif(BigNumber.compare(a,zero)==-1)
  373. {
  374. returnnewBigNumber(a.data.substring(1,a.data.length()));
  375. }else
  376. {
  377. returna;
  378. }
  379. }
  380. /**
  381. *求a的绝对值
  382. *
  383. *@parama
  384. *@returna的绝对值
  385. */
  386. publicstaticBigNumberabs(BigNumbera)
  387. {
  388. if(BigNumber.compare(a,newBigNumber("0"))==-1)
  389. {
  390. returnBigNumber.opposite(a);
  391. }else
  392. {
  393. returna;
  394. }
  395. }
  396. @Override
  397. publicStringtoString()
  398. {
  399. returnthis.data;
  400. }
  401. }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值