- packagecom.bin.bigNumber;
- /**
- *Filename:BigNumber.java
- *Description:超大数(也即高精度运算问题)
- *@author胡海斌(<ahref="mailto:335855364@qq.com"title="联系我">HuHaibin</a>)
- *@versionV1.0
- *Createat:2010-12-11下午01:21:22
- *
- *ModificationHistory:
- *DateAuthorVersionDescription
- *--------------------------------------------
- *2010-12-11userName1.01.0version
- *
- */
- publicclassBigNumberimplementsComparable<BigNumber>
- {
- privatefinalStringdata;
- publicBigNumber()
- {
- super();
- data="";
- }
- publicBigNumber(Stringdata)
- {
- if(data==null)
- this.data="";
- else
- this.data=format(data);
- }
- /**
- *对字符串进行格式化,去掉前面出现的连续零
- *
- *@params
- *@return
- */
- privateStringformat(Strings)
- {
- if(s.equals("0"))
- returns;
- intn=0;
- byteb[]=s.getBytes();
- while(b[n]=='0')
- {
- n++;
- if(n==b.length)
- break;
- }
- if(n==b.length)
- return"0";
- returns.substring(n,s.length());
- }
- /**
- *加法运算
- *
- *@parama
- *@paramb
- *@return
- */
- publicstaticBigNumberadd(BigNumbera,BigNumberb)
- {
- if(!a.data.startsWith("-")&&!b.data.startsWith("-"))
- {//a不为负数,b不为负数
- Stringstr="";
- intm=a.data.length();
- intn=b.data.length();
- inttemp,oldTemp=0;
- if(m>=n)
- {
- for(inti=0;i<m;i++)
- {
- intj;
- if(i<n)
- j=Integer
- .parseInt(b.data.substring(n-i-1,n-i));
- else
- j=0;
- temp=Integer.parseInt(a.data.substring(m-i-1,m-i))
- +j+oldTemp/10;
- oldTemp=temp;
- str=temp%10+str;
- }
- str=oldTemp/10+str;
- }else
- {
- returnBigNumber.add(b,a);
- }
- returnnewBigNumber(str);
- }elseif(a.data.startsWith("-")&&b.data.startsWith("-"))
- {//a为负数,b为负数
- returnBigNumber.opposite(BigNumber.add(BigNumber.opposite(a),
- BigNumber.opposite(b)));
- }else
- {//a、b其一为负数,另一为正数或零
- if(a.data.equals("0"))
- {
- returnb;
- }elseif(b.data.equals("0"))
- {
- returna;
- }elseif(!a.data.startsWith("-")
- &&BigNumber.compare(a,BigNumber.opposite(b))==1)
- {
- returnBigNumber.subtract(a,BigNumber.opposite(b));
- }elseif(!a.data.startsWith("-")
- &&BigNumber.compare(a,BigNumber.opposite(b))==-1)
- {
- returnBigNumber.opposite(BigNumber.subtract(BigNumber
- .opposite(b),a));
- }elseif(a.data.startsWith("-")
- &&BigNumber.compare(BigNumber.opposite(a),b)==1)
- {
- returnBigNumber.opposite(BigNumber.subtract(BigNumber
- .opposite(a),b));
- }else
- //if(a.data.startsWith("-")&&BigNumber.compare(BigNumber.oppositeNumber(a),
- //b)==-1)
- {
- returnBigNumber.subtract(b,BigNumber.opposite(a));
- }
- }
- }
- /**
- *减法运算
- *
- *@parama
- *@paramb
- *@return
- */
- publicstaticBigNumbersubtract(BigNumbera,BigNumberb)
- {
- if(BigNumber.compare(a,b)==0)
- {//a、b相等
- returnnewBigNumber("0");
- }elseif(!a.data.startsWith("-")&&!b.data.startsWith("-"))
- {//a、b不为负
- if(BigNumber.compare(a,b)==1)
- {//a大于b
- if(b.data.equals("0"))
- returna;
- Stringstr="";
- inttemp,oldTemp=0;
- intm=a.data.length();
- intn=b.data.length();
- for(inti=0;i<m;i++)
- {
- intj;
- if(i<n)
- j=Integer
- .parseInt(b.data.substring(n-i-1,n-i));
- else
- j=0;
- temp=Integer.parseInt(a.data.substring(m-i-1,m-i))
- -j-oldTemp;
- oldTemp=temp<0?1:0;
- str=(temp+10)%10+str;
- }
- returnnewBigNumber(str);
- }else
- {//a小于b
- returnBigNumber.opposite(BigNumber.subtract(b,a));
- }
- }elseif(!a.data.startsWith("-")&&b.data.startsWith("-"))
- {//a为正数,b为负数
- returnBigNumber.add(a,BigNumber.opposite(b));
- }elseif(a.data.startsWith("-")&&!b.data.startsWith("-"))
- {//a为负数,b为正数
- returnBigNumber.opposite(BigNumber.add(BigNumber.opposite(a),b));
- }else
- {//a,b均为负数
- returnBigNumber.opposite(BigNumber.subtract(BigNumber.opposite(a),
- BigNumber.opposite(b)));
- }
- }
- /**
- *乘法运算
- *
- *@parama
- *@paramb
- *@return
- */
- publicstaticBigNumbermultiply(BigNumbera,BigNumberb)
- {
- if(BigNumber.compare(a,b)>=0)
- {
- if(a.data.equals("0")||b.data.equals("0"))
- returnnewBigNumber("0");
- intl=b.data.length();
- if(l==1)
- {
- BigNumberc=newBigNumber(a.data);
- for(BigNumbertemp=newBigNumber("1");BigNumber.compare(b,
- temp)>0;temp=BigNumber.add(temp,
- newBigNumber("1")))
- {
- c=BigNumber.add(c,a);
- }
- returnc;
- }else
- {
- BigNumbertempBigNumber,resultBigNumber=newBigNumber("0");
- for(inti=0;i<l;i++)
- {
- tempBigNumber=BigNumber.multiply(a,newBigNumber(b.data
- .substring(l-i-1,l-i)));
- Stringzero="";
- for(intj=0;j<i;j++)
- {
- zero+="0";
- }
- tempBigNumber=newBigNumber(tempBigNumber.data+zero);
- resultBigNumber=BigNumber.add(resultBigNumber,
- tempBigNumber);
- }
- returnresultBigNumber;
- }
- }else
- {
- returnBigNumber.multiply(b,a);
- }
- }
- publicstaticBigNumbermultiply(BigNumbera,intb)
- {
- returnmultiply(a,newBigNumber(b+""));
- }
- /**
- *除法运算
- *
- *@parama
- *@paramb
- *@return
- */
- publicstaticBigNumberdivide(BigNumbera,BigNumberb)
- {
- if(b.data.equals("0"))
- returnnewBigNumber();
- if(!a.data.startsWith("-")&&!b.data.startsWith("-"))
- {//a、b均不为负数
- if(BigNumber.compare(a,b)==-1)
- {
- returnnewBigNumber("0");
- }elseif(BigNumber.compare(a,b)==0)
- {
- returnnewBigNumber("1");
- }else
- {
- intm=a.data.length();
- intn=b.data.length();
- Stringstr="1";
- if(BigNumber.compare(newBigNumber(a.data.substring(0,n)),b)==-1)
- {
- for(inti=0;i<m-n-1;i++)
- {
- str+="0";
- }
- }else
- {
- for(inti=0;i<m-n;i++)
- {
- str+="0";
- }
- }
- for(inti=0;i<str.length();i++)
- {
- BigNumbertemp1=BigNumber.multiply(b,(int)Math.pow(10,
- str.length()-1-i));
- for(intj=0;j<9;j++)
- {
- BigNumbertemp2=BigNumber.subtract(a,BigNumber
- .multiply(b,newBigNumber(str)));
- if(BigNumber.compare(temp2,temp1)!=-1)
- {
- str=str.substring(0,i)
- +(Integer
- .parseInt(str.substring(i,i+1))+1)
- +str.substring(i+1,str.length());
- }else
- {
- break;
- }
- }
- }
- returnnewBigNumber(str);
- }
- }elseif(a.data.startsWith("-")&&b.data.startsWith("-"))
- {//a、b均为负数
- returnBigNumber.divide(BigNumber.opposite(a),BigNumber
- .opposite(b));
- }else
- {//a、b其一为负数,另一不为负数
- if(a.data.startsWith("-"))
- {
- returnBigNumber.opposite(BigNumber.divide(BigNumber
- .opposite(a),b));
- }else
- {
- returnBigNumber.opposite(BigNumber.divide(a,BigNumber
- .opposite(b)));
- }
- }
- }
- /**
- *比较两个大数a、b的大小
- *
- *@parama
- *大数
- *@paramb
- *大数
- *@return1、0、-11表示a大于b0表示a等于b-1表示a小于b
- */
- publicstaticintcompare(BigNumbera,BigNumberb)
- {
- if(!a.data.startsWith("-")&&b.data.startsWith("-"))
- {//a不为负数,b为负数
- return1;
- }elseif(a.data.startsWith("-")&&!b.data.startsWith("-"))
- {//a为负数,b不为负数
- return-1;
- }elseif(!a.data.startsWith("-")&&!b.data.startsWith("-"))
- {//a不为负数,b不为负数
- if(a.data.length()>b.data.length())
- {//a值长度大于b值长度
- return1;
- }elseif(a.data.length()<b.data.length())
- {//a值长度小于b值长度
- return-1;
- }else
- {//a值长度等于b值长度
- if(a.data.equals(b.data))
- {a值等于b值
- return0;
- }
- inti=0;
- bytem[]=a.data.getBytes();
- byten[]=b.data.getBytes();
- for(i=0;i<m.length;i++)
- {
- if(m[i]!=n[i])
- break;
- }
- if(m[i]>n[i])
- {
- return1;
- }else
- {
- return-1;
- }
- }
- }else
- {//a为负数,b为负数
- return-(BigNumber.compare(newBigNumber(a.data.substring(1,a.data
- .length())),newBigNumber(b.data.substring(1,b.data
- .length()))));
- }
- }
- publicintcompareTo(BigNumberb)
- {
- //TODOAuto-generatedmethodstub
- returnBigNumber.compare(this,b);
- }
- /**
- *求a的相反数
- *
- *@parama
- *@returna的相反数
- */
- publicstaticBigNumberopposite(BigNumbera)
- {
- BigNumberzero=newBigNumber("0");
- if(BigNumber.compare(a,zero)==1)
- {
- returnnewBigNumber("-"+a.data);
- }elseif(BigNumber.compare(a,zero)==-1)
- {
- returnnewBigNumber(a.data.substring(1,a.data.length()));
- }else
- {
- returna;
- }
- }
- /**
- *求a的绝对值
- *
- *@parama
- *@returna的绝对值
- */
- publicstaticBigNumberabs(BigNumbera)
- {
- if(BigNumber.compare(a,newBigNumber("0"))==-1)
- {
- returnBigNumber.opposite(a);
- }else
- {
- returna;
- }
- }
- @Override
- publicStringtoString()
- {
- returnthis.data;
- }
- }
超大数的java具体实现
最新推荐文章于 2024-04-26 18:32:50 发布