大数运算

 

      今天要做 平衡树方法求前缀和的程序,但整个运算结果超过了long的范围,所以上网搜了一下解决方案:

 

     1.用_int64代替long。输出要使用printf("%I64u/n", n);

     2.用字符串代替整数,程序如下:

 

  1. 这个只能够用字符串的形式来处理了,因为计算机能够处理的最大是long型,本文以字符串的形式来进行超大数据的相加,理论上只要你的内存允许,相加多大的数都可以。 
  2. /**
  3. * 超大整数相加:
  4. * 题目要求:如果系统要使用超大整数(超过long的范围),请你设计一个数据结构来存储这种
  5. * 超大型数字以及设计一种算法来实现超大整数的加法运算
  6. * @author Administrator
  7. *
  8. */
  9. public class VeryBigNumAdd {
  10.     /**
  11.      * @param args
  12.      */
  13.     public static void main(String[] args) {
  14.        // TODO Auto-generated method stub
  15.        /*
  16.        String a="1223232";
  17.        for(int i=a.length()-1;i>=0;i--)
  18.        {
  19.            System.out.print(a.charAt(i));
  20.        }
  21.        */
  22.        VeryBigNumAdd vbn=new VeryBigNumAdd();
  23.        String a="123453243455535634535252345234677576252241234123523453664563634";
  24.        String b="123453243455535634535252345234677576252241234123523453664563634";
  25.        String result=vbn.doAdd(a,b);
  26.        System.out.println("result:"+result);
  27.     }
  28.     /**
  29.      * 
  30.      * @param a 加数字符串1
  31.      * @param b 加数字符串2
  32.      * @return 结果字符串
  33.      * 分析:
  34.      * 1、取得两个字符串的长度
  35.      * 2、把两个的长度做比较,并得出较长的长度,及较短的长度
  36.      * 3、把长度较短的加数字符串,在左面补0,使之与较长的字符串一样长
  37.      * 4、从最高位,一个个数的取出来相加,当然首先得转换为整型
  38.      * 5、设置进位,如果两个数相加及加上进位大于等于10,并且这不是最左边一个字符相加,相加结果等于
  39.      *    (取出1+取出2+进位)-10,并把进位设为1;如果没有大于10,就把进位设为0,如些循环,把
  40.      *    相加的结果以字符串的形式结合起来,就得到最后的结果
  41.      */
  42.     String doAdd(String a,String b)
  43.     {
  44.        String str="";
  45.        int lenA=a.length();
  46.        int lenB=b.length();
  47.        int maxLen=(lenA>lenB) ? lenA : lenB;
  48.        int minLen=(lenA
  49.        String strTmp="";
  50.        for(int i=maxLen-minLen;i>0;i--)
  51.        {
  52.            strTmp+="0";
  53.        }
  54.        //把长度调整到相同
  55.        if(maxLen==lenA)
  56.        {
  57.            b=strTmp+b;
  58.        }else
  59.            a=strTmp+a;
  60.        int JW=0;//进位
  61.        for(int i=maxLen-1;i>=0;i--)
  62.        {          
  63.            int tempA=Integer.parseInt(String.valueOf(a.charAt(i)));
  64.            int tempB=Integer.parseInt(String.valueOf(b.charAt(i)));
  65.            int temp;
  66.            if(tempA+tempB+JW>=10 && i!=0)
  67.            {
  68.               temp=tempA+tempB+JW-10;
  69.               JW=1;
  70.            }
  71.            else
  72.            {
  73.               temp=tempA+tempB+JW;
  74.               JW=0;
  75.            }          
  76.            str=String.valueOf(temp)+str;          
  77.        }
  78.        return str;
  79.     }
  80. }
  81. 本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/21684/showart_492172.html

     3.自定义长整数类型,定制运算

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值