第一范文网 - 专业文章范例文档资料分享平台

java自定义大数(进制可在2-62之间相互转换)

来源:用户分享 时间:2025/9/10 21:07:38 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

java自定义大数(进制可在2~62之间相互转化)

闲着没事做,写了一个自定义大数,并实现了两个大数的加减乘除以及比较,

以及2~62进制任意数(包括但不限于正整数与负整数)的相互转化

大数类: BigNumber.java /*

* 0~9用0~9表示,10~35用A~Z表示,36~61用a~z表示 */

@SuppressWarnings(\)

public class BigNumber extends Exception{

private String MyNumber;//大数 private int SystemNumber;//进制数 public BigNumber(){ }

this(\,10);

public BigNumber(String MyNumber){ this(MyNumber,10);

}

public BigNumber(String MyNumber,int SystemNumber){ this.MyNumber=MyNumber;

this.SystemNumber=SystemNumber; this.Islegal();

}

public String getMyNumber() { }

public void setMyNumber(String myNumber) { }

public int getSystemNumber() { }

public void setSystemNumber(int systemNumber) { }

this.SystemNumber = systemNumber; return this.SystemNumber; this.MyNumber = myNumber; return this.MyNumber;

public void Islegal(){//判断该字符串是否合法

if(this.MyNumber==null||this.MyNumber.length()==0){//大数为空或大数字符串长度为0

throw (new NumberFormatException(\错误!大数为空或大数字符串长度为0

\+this.MyNumber)); }

if(this.SystemNumber<=1||this.SystemNumber>=63){//进制数不合法

throw (new NumberFormatException(\错误!进制数不合法

\+this.SystemNumber)); }

if(this.MyNumber.equals(\)||this.MyNumber.equals(\)||this.MyNumber.

throw (new NumberFormatException(\错误!大数不合法 \+this.MyNumber));

equals(\)){ }

if(this.MyNumber.equals(\)||this.MyNumber.equals(\)){ }

for(int i=0,a,k=-1;i

protected static String Add_Positive(String s1,String s2,int n){//自定义两个正数加法运算 String

Ins1=getInteger(s1),Dos1=getDecimal(s1),Ins2=getInteger(s2),Dos2=getDecimal(s2);//分别获取整数部分及小数部分

int Inlength=Math.max(Ins1.length(),

Ins2.length()),Dolength=Math.max(Dos1.length(), Dos2.length()); Ins1=AddToLeft(Ins1,Inlength+1)+AddToRight(Dos1,Dolength); Ins2=AddToLeft(Ins2,Inlength+1)+AddToRight(Dos2,Dolength); String s=\;

for(int i=Inlength+Dolength,m,y=0;i>=0;i--){

m=Chartoint(Ins1.charAt(i))+Chartoint(Ins2.charAt(i))+y; s=Inttochar(m%n)+s;

a=Chartoint(this.MyNumber.charAt(i)); if(i!=0&&(a==-1||a==-2)){ }

if(a>=this.SystemNumber||a==-4){ }

if(a==-3){ }

if(k==-1){ }

k=i;

throw (new NumberFormatException(\错误!出现了第二个小数点 }else{

throw (new NumberFormatException(\错误!该字符不在该进制合法字符中 throw (new NumberFormatException(\错误!符号位只能在大数首部 throw (new NumberFormatException(\错误!大数不合法 \+this.MyNumber));

\+this.MyNumber.charAt(i)+\+i+\));

\+this.MyNumber.charAt(i)+\+i+\));

\+this.MyNumber.charAt(i)+\+i+\));

}

y=m/n;

int pointplace=s.length()-Dolength;

s=Format(s.substring(0,pointplace)+\+s.substring(pointplace),true);

return s; }

protected static String Sub_Positive(String s1,String s2,int n){//自定义两个正数减法运算;

if(ComparetoString(s1,s2)<0){//如果s1

return \+Sub_Positive(s2,s1,n);

} String

Ins1=getInteger(s1),Dos1=getDecimal(s1),Ins2=getInteger(s2),Dos2=getDecimal(s2);//分别获取整数部分及小数部分

int Inlength=Math.max(Ins1.length(),

Ins2.length()),Dolength=Math.max(Dos1.length(), Dos2.length()); String R=getComplement(new

BigNumber(AddToLeft(Ins2,Inlength)+\+AddToRight(Dos2,Dolength),n)).MyNumber;

R=Add_Positive(s1,R,n);

s2=\+AddToLeft(\,Dolength); R=Add_Positive(R,s2,n);

return Format(R.substring(1),true); }

protected static String Mult_Positive(String s1,String s2,int n){//自定义两个正数乘法运算; String

Ins1=getInteger(s1),Dos1=getDecimal(s1),Ins2=getInteger(s2),Dos2=getDecimal(s2);//分别获取整数部分及小数部分 Ins1+=Dos1; Ins2+=Dos2;

int[]A=new int[Ins1.length()+Ins2.length()-1]; for(int i=Ins1.length()-1;i>=0;i--){ }

String s=\;

for(int i=A.length-1;i>=1;i--){ }

s=Inttochar(A[i]%n)+s; A[i-1]+=A[i]/n;

for(int j=Ins2.length()-1;j>=0;j--){ }

A[i+j]+=Chartoint(Ins1.charAt(i))*Chartoint(Ins2.charAt(j));

s=Inttochar(A[0]/n)+\+Inttochar(A[0]%n)+s;//特别要注意+\ int pointlength=Dos1.length()+Dos2.length();//获取小数点后的位数 return

Format(s.substring(0,s.length()-pointlength)+\+s.substring(s.length()-pointlength),true); }

protected static String Division_Positive(String s1, String s2,int n,int f){//自定义两个正数相除(f为小数点后的位数,能被除尽,且小数点后的位数少于f,则直接返回结果); String

Ins1=getInteger(s1),Dos1=getDecimal(s1),Ins2=getInteger(s2),Dos2=getDecimal(s2); //分别获取整数部分及小数部分

int Dolength=Math.max(Dos1.length(), Dos2.length()); Ins1+=AddToRight(Dos1,Dolength); Ins2+=AddToRight(Dos2,Dolength); String[]B=new String[n];B[0]=\; for(int i=1;i

B[i]=Add_Positive(B[i-1],Ins2,n);//B[i]=Mult_Positive(Ins2,Inttochar(i)+\ }

int i=Math.min(Ins1.length(), Ins2.length())-2,j;

String Ds0=\,Ds1=Ins1.substring(0,i);//初始化整数部分余数部分 while(true){

}

return Format(Ds0,true);

if(i!=Ins1.length()){ } i++;

if(i

//下面开始求Ds1/Ins2的整数部分及余数,结果分别赋值为Ds0,Ds1;采用二分j=Binary(B,Ds1); Ds0+=Inttochar(j);

Ds1=Sub_Positive(Ds1,B[j],n);

Ds1+=Ins1.charAt(i); Ds1+=\;

if(Ds1.equals(\)||i-Ins1.length()-1==f){ }

break;

}else{

查找获取整数部分

}else{

Ds0+=\;

java自定义大数(进制可在2-62之间相互转换).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c98li75u7k30h1lk029v8_1.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top