中兴的一道笔试题:如果系统要使用超大整数(超过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);
- }
- }
相关推荐
包含大整数的各种运算函数,如加法、减法、乘法、除法、取余等
BigInt Calculator 是一个支持超大整数运算的计算器,可以对长度最多达10000位10进制的数据进行运算。它不但支持普通的四则混合运算,而且具有位操作和表达式运算功能,计算器本身提供了21个存贮单元可供保存运算的中间...
大整数加法实现 进行了良好封装
大整数四则运算 BigInt 加减乘除 括号 优先级,Python支持无限精度的运行,Java有BigInteger类,但是对C和C++就只能自己实现,这是一个带加减乘除运算的实现。
大整数类bigint,包含大整数的加法、乘法、除法等运算
自定义的C++有符号大整数类型bigint
用C++编写bigint类型,实现超过float容量的大数字乘法
在本文中小编给大家分享了关于Java的long和bigint长度比较的知识点内容,有兴趣的朋友们学习参考下。
node-bigint, 在大整数上使用 libgmp,算法 bigintnode.js 任意精度积分算法 ! 库围绕 libgmp 整数函数进行无限精度运算。你应该考虑使用基于bigint但在你的系统中更可能已经使用了openssl而不是的使用 bignum插件...
能快速实现各种运算,加减乘除求模求幂次等,封装于C++类,方便用于密码学中的ECC RSA算法
该函数是将传进的ip地址转换成bigint类型的sql函数 如:12.3.1.33 -> 201523489
num-bigint Rust,BigInt和BigUint的大整数类型。 用法将其添加到Cargo.toml:[dependencies] num-bigint =“ 0.3”功能std板条箱num-bigint Rust,BigInt和BigUint的大整数类型。 用法将其添加到您的Cargo.toml中:...
使用c语言实现的无符号大整数的加、减、乘、除(取整和求余运算),可直接运行
定义大整数类,重载算术运算+ - *等运算符与== > 关系运算符
用于魔兽服务器建立的时候应用! 用于对数据的加密,和通讯研究
无符号的bigint高精度大整数类,包含基本比较和运算,支持流式输入输出!
BigInt - 纯Swift实现的任意精度算术
ip-bigint 将IPv4和IPv6地址转换为本地BigInt,反之亦然安装npm i ip-bigint例子const { parse , stringify } = require ( "ip-bigint" ) ;const { number , version } = parse ( "2001:db8::" ) ;// => number: ...
BigInt: JavaScript中的任意精度整数
C ++ BigInt类,使用户能够使用任意精度的整数。 最新版本:10.3(2019-03-06)