之前已经完毕了大整数的表示、绝对值的比較大小、取负值、加减法运算以及乘法运算。

详细见前两篇博客(自己动手写Java * )。

这里加入除法运算。

另外看到作者Pauls Gedanken在blog(http://paul-ebermann.tumblr.com/post/6312290327/big-numbers-selfmade-part-2-14-conversion-from)中的转换十进制数到大整数的方法,这里一并列出。

除法

除法使用经典的除法法则,可是有几个须要注意的问题,以下列出。

1,除数是0的问题;

2。两者相等,输出1余数是被除数;

3。除数比較大,直接输出0。余数是被除数

4,子数组长度和除数数组长度相等或者大1。相等时候结果由子数组第一位除以除数第一位决定,

大1时候结果通过子数组头两位除以除数第一位决定

5,判定结果第一位是否为0.

我们看下简单的图演示样例子。看看除法的详细操作

	/*
* 除法
*/ public DecimalBig Divide(DecimalBig that)
{
if (that.Compare(Zero)==0)
throw new IllegalArgumentException("Divided by 0!");
if (this.Abscompare(that)==-1)
return Zero;
if (this.Abscompare(that)==0)
return One; int thislength=this.digits.length;
int thatlength=that.digits.length; int[] mulres=new int[thatlength];
System.arraycopy(this.digits, 0, mulres, 0, thatlength);
int digitdivide=0;
int[] result=new int[thislength-thatlength+1]; for (int i=0; i<thislength-thatlength;i++)
{
if (Arraycompare(mulres,that.digits)==-1)
{
digitdivide=0;
} else
{
if (mulres.length==that.digits.length)
digitdivide=mulres[0]/that.digits[0];
else{
long firtwei=(long)mulres[0]*Radix+mulres[1];
digitdivide=(int)firtwei/that.digits[0]; } int[] temp=Multiplyint(that.digits, digitdivide); if (Arraycompare(mulres,temp)==-1){
digitdivide-=1;
temp=Substract(temp,that.digits);
}
mulres=Substract(mulres, temp);
} result[i]=digitdivide;
if (mulres.length==1&&mulres[0]==0){
mulres[0]=this.digits[i+thatlength];
}else{
int[] temp2=new int[mulres.length+1];
System.arraycopy(mulres, 0, temp2, 0, mulres.length);
temp2[mulres.length]=this.digits[i+thatlength];
mulres=temp2;
}
} if (Arraycompare(mulres,that.digits)==-1)
{
digitdivide=0;
} else
{
if (mulres.length==that.digits.length)
digitdivide=mulres[0]/that.digits[0];
else{
long firtwei=(long)mulres[0]*Radix+mulres[1];
long ttt=firtwei/that.digits[0];
digitdivide=(int) ttt;
} int[] temp=Multiplyint(that.digits, digitdivide); if (Arraycompare(mulres,temp)==-1){
digitdivide-=1;
temp=Substract(temp,that.digits);
}
mulres=Substract(mulres, temp);
} /*
* 最后的mulres就是余数。
*/ result[thislength-thatlength]=digitdivide;
/*
* 去掉首位的零
*/
int i=0;
while(i<result.length&&result[i]==0)
i++;
//截取非零项
int[] temp = new int[result.length-i];
System.arraycopy(result, i, temp, 0, result.length-i);
result = temp; return new DecimalBig(1, result);
} /*
* 除法余数
*/ public DecimalBig DivideReminder(DecimalBig that)
{
if (that.Compare(Zero)==0)
throw new IllegalArgumentException("Divided by 0!");
if (this.Abscompare(that)==-1)
return this;
if (this.Abscompare(that)==0)
return Zero; int thislength=this.digits.length;
int thatlength=that.digits.length; int[] mulres=new int[thatlength];
System.arraycopy(this.digits, 0, mulres, 0, thatlength);
int digitdivide=0;
int[] result=new int[thislength-thatlength+1]; for (int i=0; i<thislength-thatlength;i++)
{
if (Arraycompare(mulres,that.digits)==-1)
{
digitdivide=0;
} else
{
if (mulres.length==that.digits.length)
digitdivide=mulres[0]/that.digits[0];
else{
long firtwei=(long)mulres[0]*Radix+mulres[1];
digitdivide=(int)firtwei/that.digits[0]; } int[] temp=Multiplyint(that.digits, digitdivide); if (Arraycompare(mulres,temp)==-1){
digitdivide-=1;
temp=Substract(temp,that.digits);
}
mulres=Substract(mulres, temp);
} result[i]=digitdivide;
if (mulres.length==1&&mulres[0]==0){
mulres[0]=this.digits[i+thatlength];
}else{
int[] temp2=new int[mulres.length+1];
System.arraycopy(mulres, 0, temp2, 0, mulres.length);
temp2[mulres.length]=this.digits[i+thatlength];
mulres=temp2;
}
} if (Arraycompare(mulres,that.digits)==-1)
{
digitdivide=0;
} else
{
if (mulres.length==that.digits.length)
digitdivide=mulres[0]/that.digits[0];
else{
long firtwei=(long)mulres[0]*Radix+mulres[1];
long ttt=firtwei/that.digits[0];
digitdivide=(int) ttt;
} int[] temp=Multiplyint(that.digits, digitdivide); if (Arraycompare(mulres,temp)==-1){
digitdivide-=1;
temp=Substract(temp,that.digits);
}
mulres=Substract(mulres, temp);
} /*
* 最后的mulres就是余数。 */ return new DecimalBig(1, mulres);
}

十进制转换

引自Pauls Gedanken的方法

    /**引用
* Pauls Gedanken在bloghttp://paul-ebermann.tumblr.com/post/6312290327/big-numbers-selfmade-part-2-14-conversion-from
* 中的方法
* creates a DecimalBigInt from a decimal representation.
* @param decimal a string of decimal digits.
* @throws NumberFormatException if the number is not in
* correct decimal format, e.g. if it contains any characters
* outside of 0..9.
*/
public static DecimalBig valueOf(int si, String decimal) {
int decLen = decimal.length();
int bigLen = (decLen-1) / Radix_Decimal_length + 1;
// length of first block
int firstSome = decLen - (bigLen-1) * Radix_Decimal_length;
int[] digits = new int[bigLen];
for(int i = 0; i < bigLen ; i++) {
String block =
decimal.substring(Math.max(firstSome + (i-1)*Radix_Decimal_length, 0),
firstSome + i *Radix_Decimal_length);
digits[i] = Integer.parseInt(block);
}
return new DecimalBig(si, digits);
}

自己动手写Java大整数《3》除法和十进制转换的更多相关文章

  1. [JVM] - 一份<自己动手写Java虚拟机>的测试版

    go语言下载 配置GOROOT(一般是自动的),配置GOPATH(如果想自己改的话) 参照<自己动手写Java虚拟机> > 第一章 指令集和解释器 生成了ch01.exe文件 这里还 ...

  2. 自己动手写java 字节流输入输出流

    数据流是一串连续不断的数据的集合,就象水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流.   "流是磁盘或其它外围设备中存储的数据的源点或终点." ...

  3. 关于Java大整数是否是素数

    题目描述 请编写程序,从键盘输入两个整数m,n,找出等于或大于m的前n个素数. 输入格式: 第一个整数为m,第二个整数为n:中间使用空格隔开.例如: 103 3 输出格式: 从小到大输出找到的等于或大 ...

  4. 自己动手写java锁

    1.LockSupport的park和unpark方法的基本使用,以及对线程中断的响应性 LockSupport是JDK中比较底层的类,用来创建锁和其他同步工具类的基本线程阻塞原语.java锁和同步器 ...

  5. JAVA大整数傻瓜入门

    http://blog.csdn.net/skiffloveblue/article/details/7032290..先记着

  6. java 中整数类型的进制转换

    int a=10; Integer.toBinaryString(a); //转换成2进制Integer.toOctalString(a);  //转换成8进制Integer.toHexString( ...

  7. [大整数乘法] java代码实现

    上一篇写的“[大整数乘法]分治算法的时间复杂度研究”,这一篇是基于上一篇思想的代码实现,以下是该文章的连接: http://www.cnblogs.com/McQueen1987/p/3348426. ...

  8. Coefficient Computation (大整数、Java解决)

    Coefficient Computation UVALive8265 题意:计算组合数C(n,k)的值并将值按给定的进制输出. 思路:Java大整数类硬上. PS:刚刚学完Java的大整数类,结果却 ...

  9. COJ 1211 大整数开平方

    手写求大整数开根号所得到的值,具体计算过程参考别人的资料,最后利用java的大整数得到答案 别人博客链接:http://www.cnblogs.com/Rinyo/archive/2012/12/16 ...

随机推荐

  1. 一周学会Mootools 1.4中文教程:(4)类型

    Mootools的类型主要包含下边几部分:String:字符串;Number:数字;Array:数组;Object:对象;Json:;Cookie:. 这也是我们今天的讲述重点.每一种数据类型Mt都为 ...

  2. MySQLD 配置

    http://blog.163.com/sir_876/blog/static/11705223201372710303382/ http://www.kankanews.com/ICkengine/ ...

  3. SSD常见问题的技术分析

    AHCI对性能的影响 AHCI,全称Advanced Host Controller Interface,即高级主机控制器接口,是一种相比老旧的“IDE虚拟模式”更适合新一代SATA存储设备通信的协议 ...

  4. Q_D宏

    Qt 源码中有很多Q_Q和Q_D宏,使用这些宏的地方总会看到有q指针和d指针,查了查KDE文档,大体搞清了其中的机理,欧也!Qt的这些私有数据访问策略还是挺值得借鉴.下面就简单总结一下. 访问器 , ...

  5. Optipng—PNG的优化图像工具初探

    PNG 即 Portable Network Graphic 的简称,PNG 图像是一种无损压缩图像文件格式.因为网络传输的需要,我们总是希望 PNG 图像的容量能够小些.小些.再小些.要优化 PNG ...

  6. POJ 3450 Corporate Identity(KMP)

    [题目链接] http://poj.org/problem?id=3450 [题目大意] 求k个字符串的最长公共子串,如果有多个答案,则输出字典序最小的. [题解] 我们对第一个串的每一个后缀和其余所 ...

  7. C# DLL文件注册问题(涉及AxInterop.WMPLib.dll等)

    近日遇到问题,给客户安装软件涉及视频等音影播放,安装软件启动过程遇到这样问题: 分析报错原因: 没有注册类别 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG ...

  8. SQL基础查询实战

    总结: 一.单表查询的情况: 1.where.....group by .. Having count(..) 2.Group by haing min(..)条件and max(..)条件(查询最低 ...

  9. Android企业级程序完全退出的解决方案【转】

    http://blog.csdn.net/wangjinyu501/article/details/8763552 问题描述 在平常开发的过程中可以发现,很多开发者对于程序的退出都没有去认真的解决.一 ...

  10. 线性规划问题的matlab求解

    函数:[x, fval] = linprog(f, A, b, Aeq, Beq, LB, UB) 返回的x:是一个向量——在取得目标函数最小时各个xi的取值: 返回的fval:目标函数的最小值: 参 ...