首页 | 源码下载 | 网站模板 | 网页特效 | 广告代码 | 网页素材 | 字体下载 | 书库 | 站长工具
会员投稿 投稿指南 RSS订阅
当前位置:主页>网络编程>java教程>资讯:Java借助数组构造大数实现大数相加

Java借助数组构造大数实现大数相加

www.jz123.cn  2010-05-07   来源:   中国建站    责任编辑(袁袁)    我要投递新闻

  本文介绍一种借助字符串数组实现大数相加的运算。

  思想很简单,就是对输入的大数当作字符串来处理,这样就不受数值位数的限制了。其中要处理的最主要的一个问题相加进位处理。

  附件中有包含测试程序的所有源代码。

  package com.nileader.big.entity;

  public class BigInt {

  private String data_str; //原始数据

  private int digit; //数据位数

  private int[] data; //大数

  private boolean carry = false; //进位标识符

  /**

  * setter and getter

  */

  public boolean isCarry() {

  return carry;

  }

  public void setCarry(boolean carry) {

  this.carry = carry;

  }

  public String getData_str() {

  return data_str;

  }

  public void setData_str(String data_str) {

  this.data_str = data_str;

  }

  public int[] getData() {

  return data;

  }

  public void setData(int[] data) {

  this.data = data;

  }

  public int getDigit() {

  return digit;

  }

  public void setDigit(int digit) {

  this.digit = digit;

  }

  //构造方法

  public BigInt(){};

  public BigInt(String str_data)

  {

  this.setData_str(str_data);

  }

  //基本操作

  /**

  * 形成大数 初始化

  */

  public void initBInt()

  {

  this.setDigit( this.getData_str().length() );

  this.data = new int[this.getDigit()];

  //将字符组成的大数逆序放入int[] data中

  for(int i = 0, j=this.getDigit() ; i

  {

  // 1104 --> data[0] = '4',data[1] = '0',data[2]=1, data[3]= '1'

  this.data[i] = Integer.parseInt( this.getData_str().substring(j-1,j) );

  }

  }

  /**

  * 进行大数相加操作

  */

  public void add( BigInt bint)

  {

  //this的位数大于bint的位数

  if( this.getDigit() < bint.getDigit() )

  {

  int[] datatemp = this.getData();

  this.setData( bint.getData());

  bint.setData( datatemp);

  this.setDigit(this.getData().length);

  bint.setDigit(bint.getData().length);

  }

  //将短的那个先加完

  int i =0;

  for(; i

  {

  int tdata = 0;

  //上次运算有进位

  if( this.isCarry())

  {

  tdata = this.getData()[i] + bint.getData()[i] +1;

  //取消进位标识

  this.setCarry(false);

  }

  else tdata = this.getData()[i] + bint.getData()[i] ;

  //本次结果无进位

  if(tdata <10) this.data[i] = tdata;

  //本次结果有进位

  else if(tdata >=10)

  {

  this.data[i] = tdata -10;

  this.setCarry(true);

  }

  } //短的那个加完了

  //剩余数的处理

  for(;i

  {

  //有个进位的

  if(this.isCarry())

  {

  int tdata = this.data[i]+1;

  if(tdata >=10) this.data[i] = tdata -10;

  else

  {

  this.data[i] = tdata;

  this.setCarry(false);

  }

  }

  }

  //对最高位益处检测

  if(this.data[this.getDigit()-1] == 0)

  {

  int[] tdata = new int[this.getDigit()+1];

  System.arraycopy(this.getData(), 0, tdata, 0, this.getDigit());

  tdata[this.getDigit()] = 1;

  this.setData(tdata);

  }

  }

  }

  其中代码段

  //对最高位益处检测

  if(this.data[this.getDigit()-1] == 0)

  {

  int[] tdata = new int[this.getDigit()+1];

  System.arraycopy(this.getData(), 0, tdata, 0, this.getDigit());

  tdata[this.getDigit()] = 1;

  this.setData(tdata);

  }

  就是用来处理数字进位的。

  本文出自 “ni掌柜在路上” 博客,请务必保留此出处http://nileader.blog.51cto.com/1381108/309784


上一篇:[Java经典题目]求Fibonacci斐波那契数列 下一篇:实战角度比较EJB2和EJB3的架构异同

评论总数:0 [ 查看全部 ] 网友评论


关于我们隐私版权广告服务友情链接联系我们网站地图