`

用java数组实现BigInt超大整数设计

 
阅读更多

中兴的一道笔试题:如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算)。

 

Java代码  收藏代码
  1. package com.test;  
  2.   
  3. import org.apache.commons.lang.StringUtils;  
  4.   
  5. /** 
  6.  * @author jsczxy2 
  7.  *  
  8.  */  
  9. public class BigInt {  
  10.       
  11.     public static void main(String[] args) {  
  12.         BigInt a = new BigInt("367892732043217489143432876442367892732043217489143432876442367892732043217489143432876442367892732043217489143432876442");  
  13.         BigInt b = new BigInt("3678927329999999999999994328736789273299999999999999943287367892732043217489143432876442367892732043217489143432876442");  
  14.         System.out.println(a.toString());  
  15.         System.out.println(b.toString());  
  16.         System.out.println(a.add(b));  
  17.     }  
  18.   
  19.     private int[] arrayint = new int[100];  
  20.   
  21.     public BigInt(String num) {  
  22.         //分解数字到int数组中  
  23.         splitNumToArray(num);  
  24.     }  
  25.   
  26.     public void splitNumToArray(String num) {  
  27.         int j = 0;  
  28.         StringBuffer sb = new StringBuffer();  
  29.         //数字全部翻转后分组截取后再翻转回来加入int数组,这里控制数组中每一个int元素恒定为8位不超过int最大长度  
  30.         num = new StringBuffer(num).reverse().toString();  
  31.         for (int i = 0; i <num.length(); i++) {  
  32.             if (i % 8 == 0) {  
  33.                 if (sb != null && !sb.toString().equals("")){  
  34.                     arrayint[j] = Integer.valueOf(sb.reverse().toString());  
  35.                     j++;  
  36.                     sb = new StringBuffer();  
  37.                 }  
  38.             }  
  39.                 sb.append(num.charAt(i));  
  40.               
  41.         }  
  42.         if (sb != null) {  
  43.             arrayint[j] = Integer.valueOf(sb.reverse().toString());  
  44.         }  
  45.     }  
  46.   
  47.     //数组从后开始打印数字,不满8位补齐8位数字用0进行左填充  
  48.     public String printArray(int[] array) {  
  49.         StringBuffer sb = new StringBuffer();  
  50.         boolean isNotFirstInt = false;  
  51.         for (int i = array.length-1; i >=0 ; i--) {  
  52.             if (array[i] != 0) {  
  53.                 System.out.println(i+":"+array[i]);  
  54.                 if(isNotFirstInt && String.valueOf(array[i]).length()<8){  
  55.                     sb.append(StringUtils.leftPad(String.valueOf(array[i]), 8,"0"));  
  56.                 }else{  
  57.                     sb.append(array[i]);  
  58.                     if(!isNotFirstInt)  
  59.                         isNotFirstInt = true;  
  60.                 }  
  61.                   
  62.             }  
  63.         }  
  64.         return sb.toString();  
  65.     }  
  66.   
  67.     //BigInt数字进行加法运算  
  68.     public String add(BigInt bigInt) {  
  69.         int[] a = this.arrayint;  
  70.         int[] b = bigInt.arrayint;  
  71.         int[] result = new int[100];  
  72.         //根据各种情况进行结果赋值  
  73.         for(int i=0;i<a.length;i++){  
  74.             if(a[i]==0&&b[i]!=0){  
  75.                 result[i]=b[i];  
  76.             }else if(a[i]!=0&&b[i]==0){  
  77.                 result[i]=a[i];  
  78.             }else if(a[i]!=0&&b[i]!=0){  
  79.                 result[i]=a[i]+b[i];  
  80.             }else{  
  81.                 result[i]=0;  
  82.             }  
  83.         }  
  84.         //处理结果数组中超过8位的int元素的进位,该int元素截掉1位后再把其后一个元素值加一  
  85.         for(int i=0;i<result.length;i++){  
  86.             if(String.valueOf(result[i]).length()>8){  
  87.                 result[i] = Integer.valueOf(String.valueOf(result[i]).substring(1));  
  88.                 result[i+1] = result[i+1] + 1;  
  89.             }  
  90.         }  
  91.         return printArray(result);  
  92.     }  
  93.   
  94.     //打印BigInt数字  
  95.     @Override  
  96.     public String toString() {  
  97.         return printArray(arrayint);  
  98.     }  
  99.   
  100. }  
分享到:
评论

相关推荐

    java大数(以数组形式保存整数,实现整数加减)

    在Java编程语言中,处理大数(大数据量的...以上就是使用数组形式保存整数并实现整数加减的基本思路和关键点。这个过程涉及到数组操作、进位与借位、溢出检查等多个核心概念,对理解和掌握大数运算有很好的实践价值。

    大整数(java版)

    在Java编程语言中,"大整数"是指那些超过普通整型数据类型所能表示范围的数值。Java提供了`BigInteger`类来处理这类大数据。`BigInteger`是Java的标准库`java.math`包的一部分,它允许我们执行任意精度的算术运算,...

    Java的long和bigint长度对比详解

    在 Java 中,我们可以使用数组来实现 bigint 的存储和运算。例如,我们可以使用一个整数数组来存储 bigint 的每一位数字,然后使用循环来实现大整数的加法运算。 以下是一个简单的 BigInt 类的实现: ```java ...

    超级大整数相加.zip

    这个场景下,我们有一个名为"BigInt.java"的源代码文件,它很可能实现了一个自定义的大整数类,用于处理大整数的运算。同时,"面试编程.txt"可能包含了关于这个问题的面试问题和解答,或者是一些关于如何设计此类的...

    Java 实现大数类

    大数类的设计通常基于字符串或数组,因为Java的int、long等类型无法存储超出它们范围的大整数。在这个项目中,我们可能会选择使用字符串来表示大数,因为字符串可以容纳任意长度的数字。首先,我们需要定义一个名为`...

    大整数问题

    类`bigint`使用一个整数数组`a[100]`来存储大整数,数组的大小足以容纳大多数实际应用中的大整数。数组的最后一个元素`n`表示大整数的有效位数。初始化时,设置`n=1`且所有元素为0,除了`a[1]`设为1,表示整数的...

    bigint-10-2-src

    3. 操作符重载:为了使得BigInt在语法上与普通整数类似,通常会实现操作符重载,如+、-、*、/、%等,以便进行加减乘除和取模运算。 4. 运算算法:大数计算涉及到的主要算法有: - 加法和减法:使用位操作,逐位...

    sqlserver数据库类型对应Java中的数据类型

    在 Java 中,对数据库的操作需要通过 JDBC(Java Database Connectivity)来实现,而在 JDBC 中,需要将 SQL Server 的数据类型映射到 Java 中的数据类型。下面将详细介绍 SQL Server 数据库类型对应 Java 中的数据...

    大整数算法

    描述中的 "bigint-1-0-src" 提示这是一个关于大整数算法的源代码库,可能是版本1.0的实现。源代码库通常包含了实现特定算法的编程语言代码,可能包括各种数据结构、方法和函数,用于处理大整数的操作,如加减乘除、...

    大整数加减乘除运算

    以上就是大整数加减乘除运算的基本原理和实现方法,实际应用中还需结合特定的编程语言和库,例如Python的`decimal`模块、Java的`BigInteger`类等,它们提供了封装好的大整数操作接口,方便开发者使用。

    JAVA面试题资料汇总及答案整理.pdf

    10. 超大整数表示:为了存储超过`long`类型的超大整数,可以使用一个数组(如`BigInt`类示例)存储每个位的数值,然后设计相应的算法(如大数加法)进行数学运算。 11. 图形系统的基本元件:基本图形元件包括点...

    常见的java基础考题

    对于超大整数,可以使用数组存储每个位上的数字,例如一个BigInt类,包含一个整数数组。实现加法运算时,可以使用类似于笔算加法的方法,从低位到高位逐位相加,如果某一位相加结果大于9,则需要进位到上一位。 ...

    Java 面试题(Java面试题 最新的面试题)

    9. 超大整数的存储与运算:可以设计一个类`BigInt`,使用数组存储超大整数的位,如`ArrOne`,并实现加法运算方法。 10. 图形系统设计:基本图形元件如点(Point),线(Line),矩形(Rectangle)和三角形(Triangle)可以...

    Java数据类型和MySql数据类型对应一览

    Java 数据类型和 MySql 数据类型对应一览 在 Java 编程语言中,数据类型是指变量或函数可以持有的值的类型。...了解这些对应关系对于开发者来说非常重要,因为它们可以帮助开发者更好地设计和实现数据库应用程序。

    ipv4和ipv6字符串转换成数字

    - 对于其他非空段落,先将其解析为整数,再转换为字节并存入数组。 #### BigInteger转换为字符串 为了将`BigInteger`类型的IP地址转换回字符串形式,代码使用了`BigIntToString`方法。该方法首先将`BigInteger`...

    MySql于Java数据类型对应列表

    在进行数据库操作时,尤其是在使用Java进行MySQL数据库开发的过程中,正确地映射数据类型是至关重要的一步。本文将详细介绍MySQL中的各种数据类型及其在Java中的对应类型,并解释这些类型的具体含义以及它们在实际...

Global site tag (gtag.js) - Google Analytics