超过 8 字节整数的可以试试 java.math.BigInteger,不存在值溢出的问题,至于内存溢出,我想java也没办法吧……你的整数大到让jvm吐血?

解决方案 »

  1.   

    如果数字大,用java.math.BigInteger,
    然后就和一般的 写发一样!
      

  2.   

    嗯~曾经想过这个算法
    一般使用在比较庞大的数据运算的
    比如亿单位级的加法或乘法
    不过只有个思路 可以提供给你下 我还只是在概念阶段没有写出来
    首先用数组拆分所要进行操作的数字,2个数组分别存放要进行操作的值
    再声明几个变量用作进位操作
    例如:
    a[10],b[10],c[10]
    3个数组
    a[0],b[0]存放前10^3的数字
    c[0]存放运算时候的进位问题
    这样分段算出来以后
    再吧计算结果
    转换为string输出来
    肯定不会出现数字的溢出情况了
    个人意见,仅供参考
      

  3.   

    做过acm的话,就知道如何做大数运算了。
      

  4.   

    这是一道面试题,只是让我口头讲一下如何实现...面试java开发的...我当时就晕了
      

  5.   

    1.java里面可以BigInteger直接算
    2.c++里面可以写个类封装一下,用字符串来算
    3.c里面可以用结构体,和c++差不多
      

  6.   

    能有多大String v1 = "11111111111111111111111111111111111";
    String v1 = "22222222222222222222222222222";  BigDecimal b1 = new BigDecimal(v1);
      BigDecimal b2 = new BigDecimal(v2);
      return b1.multiply(b2).toString();
      

  7.   

    用BigInteger,
    如果要自己实现,就是用字符数组.
    自己定义乘法方法,以前用C实现过
    100!,后面有好多的0,也可以把它记下来.
      

  8.   

    From: java.math.BigInteger/**
         * Multiplies int arrays x and y to the specified lengths and places
         * the result into z.
         */
        private int[] multiplyToLen(int[] x, int xlen, int[] y, int ylen, int[] z) {
            int xstart = xlen - 1;
            int ystart = ylen - 1;        if (z == null || z.length < (xlen+ ylen))
                z = new int[xlen+ylen];        long carry = 0;
            for (int j=ystart, k=ystart+1+xstart; j>=0; j--, k--) {
                long product = (y[j] & LONG_MASK) *
                               (x[xstart] & LONG_MASK) + carry;
                z[k] = (int)product;
                carry = product >>> 32;
            }
            z[xstart] = (int)carry;        for (int i = xstart-1; i >= 0; i--) {
                carry = 0;
                for (int j=ystart, k=ystart+1+i; j>=0; j--, k--) {
                    long product = (y[j] & LONG_MASK) * 
                                   (x[i] & LONG_MASK) + 
                                   (z[k] & LONG_MASK) + carry;
                    z[k] = (int)product;
                    carry = product >>> 32;
                }
                z[i] = (int)carry;
            }
            return z;
        }