`
jsczxy2
  • 浏览: 1270806 次
  • 性别: Icon_minigender_1
  • 来自: 常州
文章分类
社区版块
存档分类
最新评论

数据结构与算法:用java数组实现BigInt超大整数设计

阅读更多

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

 

package com.test;

import org.apache.commons.lang.StringUtils;

/**
 * @author jsczxy2
 * 
 */
public class BigInt {
	
	public static void main(String[] args) {
		BigInt a = new BigInt("367892732043217489143432876442367892732043217489143432876442367892732043217489143432876442367892732043217489143432876442");
		BigInt b = new BigInt("3678927329999999999999994328736789273299999999999999943287367892732043217489143432876442367892732043217489143432876442");
		System.out.println(a.toString());
		System.out.println(b.toString());
		System.out.println(a.add(b));
	}

	private int[] arrayint = new int[100];

	public BigInt(String num) {
		//分解数字到int数组中
		splitNumToArray(num);
	}

	public void splitNumToArray(String num) {
		int j = 0;
		StringBuffer sb = new StringBuffer();
		//数字全部翻转后分组截取后再翻转回来加入int数组,这里控制数组中每一个int元素恒定为8位不超过int最大长度
		num = new StringBuffer(num).reverse().toString();
		for (int i = 0; i <num.length(); i++) {
			if (i % 8 == 0) {
				if (sb != null && !sb.toString().equals("")){
					arrayint[j] = Integer.valueOf(sb.reverse().toString());
					j++;
					sb = new StringBuffer();
				}
			}
				sb.append(num.charAt(i));
			
		}
		if (sb != null) {
			arrayint[j] = Integer.valueOf(sb.reverse().toString());
		}
	}

	//数组从后开始打印数字,不满8位补齐8位数字用0进行左填充
	public String printArray(int[] array) {
		StringBuffer sb = new StringBuffer();
		boolean isNotFirstInt = false;
		for (int i = array.length-1; i >=0 ; i--) {
			if (array[i] != 0) {
				System.out.println(i+":"+array[i]);
				if(isNotFirstInt && String.valueOf(array[i]).length()<8){
					sb.append(StringUtils.leftPad(String.valueOf(array[i]), 8,"0"));
				}else{
					sb.append(array[i]);
					if(!isNotFirstInt)
						isNotFirstInt = true;
				}
				
			}
		}
		return sb.toString();
	}

	//BigInt数字进行加法运算
	public String add(BigInt bigInt) {
		int[] a = this.arrayint;
		int[] b = bigInt.arrayint;
		int[] result = new int[100];
		//根据各种情况进行结果赋值
		for(int i=0;i<a.length;i++){
			if(a[i]==0&&b[i]!=0){
				result[i]=b[i];
			}else if(a[i]!=0&&b[i]==0){
				result[i]=a[i];
			}else if(a[i]!=0&&b[i]!=0){
				result[i]=a[i]+b[i];
			}else{
				result[i]=0;
			}
		}
		//处理结果数组中超过8位的int元素的进位,该int元素截掉1位后再把其后一个元素值加一
		for(int i=0;i<result.length;i++){
			if(String.valueOf(result[i]).length()>8){
				result[i] = Integer.valueOf(String.valueOf(result[i]).substring(1));
				result[i+1] = result[i+1] + 1;
			}
		}
		return printArray(result);
	}

	//打印BigInt数字
	@Override
	public String toString() {
		return printArray(arrayint);
	}

}
4
1
分享到:
评论

相关推荐

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

    在Java编程语言中,处理大数(大数据量的整数)是常见的需求,尤其是在加密算法、金融计算或者数学运算中。Java提供了`java.math.BigInteger`类来支持大数操作,但如果我们想要自定义一个解决方案,以数组的形式存储...

    大整数算法

    源代码库通常包含了实现特定算法的编程语言代码,可能包括各种数据结构、方法和函数,用于处理大整数的操作,如加减乘除、比较、取模等。 标签 "bigint-1-0-src" 重申了主题,强调这是一个与大整数算法相关的源代码...

    bigint-10-2-src

    2. 数据结构与表示:BigInt通常通过链表、数组或二进制位数组的形式来存储大数。这种数据结构可以动态扩展以适应任意长度的数字。 3. 操作符重载:为了使得BigInt在语法上与普通整数类似,通常会实现操作符重载,如...

    大整数问题

    在计算机科学中,大整数(Big Integer)是指超过...然而,实际的高性能大整数库,如Java的`BigInteger`或C++的GMP(GNU Multiple Precision Arithmetic Library),通常会使用更高效的数据结构和算法来优化这些操作。

    超级大整数相加.zip

    总的来说,理解和实现大整数加法不仅涉及到基本的数学概念,还涵盖了数据结构、算法和编程技巧。通过分析`BigInt.java`和阅读`面试编程.txt`,你可以更深入地了解这个主题,并准备应对类似的面试问题。

    大整数加减乘除运算

    在标准的整型数据类型如int、long等无法满足需求时,我们需要使用特殊的数据结构和算法来实现大整数的加、减、乘、除以及取模等操作。这些操作在密码学、分布式计算、数学软件等领域有着广泛的应用。 **大整数的...

    大整数乘法(改进)

    ### 大整数乘法(改进):Java实现与优化 在计算机科学中,处理大整数乘法是一项挑战性的任务,特别是在传统整型数据结构(如`int`或`long`)无法满足需求时。Java语言提供了强大的库支持来处理大整数,但自定义算法...

    java面试题集锦.doc

    9. **超大整数处理**:处理超大整数时,可以使用自定义数据结构,如题中所示的BigInt类,用数组存储每一位数字,并实现相应的加法运算。 10. **图形系统**:设计基本图形元件,如Point、Line、Rectangle和Triangle...

    大数的四则运算

    总结来说,大数四则运算是计算机科学中处理超大整数的重要手段,它涉及到数据结构的选择、高效的算法实现以及各种编程语言中的支持。理解和掌握大数运算,对于开发涉及大数据量计算的应用程序具有重要意义。

    java面试题

    对于超大整数,可以使用一个数组来存储每一位数字,然后实现加法算法。例如,创建一个`BigInt`类,其中包含一个整型数组`ArrOne`来存储每一位数字,通过定义加法方法来实现两个超大整数的加法运算。 #### 11. 图形...

    高精度 加减乘除 代码

    为了解决这个问题,我们可以自定义数据结构和算法来实现高精度计算。这里我们以Pascal语言为例,探讨如何编写高精度加、减、乘法的源代码。 1. **高精度加法**: 在Pascal程序`gaojing_jia`中,首先定义了一个常量...

    Java常见面试题集--面试题全面综合(二)

    对于超大整数,可以采用数组存储每一位数的方式,并实现相应的加法运算算法。例如,可以创建一个`BigInt`类,其中包含一个整型数组用于存储数值,并提供加法运算方法。 ```java public class BigInt { private int...

    ACM中java的使用.pdf

    综上所述,ACM竞赛中Java的使用涵盖了基本的输入输出、字符串处理、高精度计算以及数据结构和算法的应用,掌握这些知识点对于参赛者来说至关重要。通过熟练运用这些工具,可以有效地解决竞赛中遇到的各种问题。

    企业招聘java程序员的面试题

    10. **超大整数存储和加法**:对于超大整数,可以使用数组存储每个位,如`BigInt`类中的`int[] ArrOne`。实现加法操作,遍历数组,逐位相加,考虑进位。 11. **图形系统的基本元件**:设计图形系统时,基础元件包括...

    java,j2ee,struts资料大全

    10. 超大整数处理:超大整数可通过数组或链表结构存储,例如,可以定义一个BigInt类,包含一个整数数组ArrOne存储每一位。加法运算可以采用模拟手动计算的过程,逐位相加并处理进位。 11. 图形系统设计:基本图形...

Global site tag (gtag.js) - Google Analytics