JAVA大数类库初始化BigInteger问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA大数类库初始化BigInteger问题相关的知识,希望对你有一定的参考价值。

我在初始化BigInteger 时,
①BigInteger a =new BigInteger("123");
system.out.print(a);
②BigInteger b =new BigInteger("abc");
system.out.print(b);
第一句是可以正确输出123的,但是第二句不会输出abc。
请问,我要做什么修改,能够使得JAVA将数字以外的字符正确转化为大数类型?

参考技术A BigInteger(byte[] val)
将包含 BigInteger 的二进制补码表示形式的 byte 数组转换为 BigInteger。
BigInteger(int signum, byte[] magnitude)
将 BigInteger 的符号-数量表示形式转换为 BigInteger。
BigInteger(int bitLength, int certainty, Random rnd)
构造一个随机生成的正 BigInteger,它可能是一个具有指定 bitLength 的素数。
BigInteger(int numBits, Random rnd)
构造一个随机生成的 BigInteger,它是在 0 到 (2numBits - 1)(包括)范围内均匀分布的值。
BigInteger(String val)
将 BigInteger 的十进制字符串表示形式转换为 BigInteger。
BigInteger(String val, int radix)
将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger。
BigInteger是用来存放整数的 你放字符串肯定是不行的 可以转成ascii等 以数字的形式存放字符串追问

如何转成ASCII码?

参考技术B 首先你要确定abc是什么进制,若为16进制,则代码如下:
BigInteger b=new BigInteger("abc",16);
System.out.println(b);

输出结果:2748追问

你这样是可以。但是我要是
res11=res1.getText();
BigInteger b=new BigInteger(res11,16);
System.out.println(b);
就同样无法正确输出,怎么办

追答

res1是什么类型?res1.getText()得到的是什么样的结果?若出现错误一定是res11里边有除合法字符(数字和字母a-f)外的其它字符。

追问

res1是文本区域。通过res11接受文本区域内输入的字符串。不管文本区域中有哪些字符,res11都可以正确输出额

追答

这估计要用正则表达式进行过滤了吧,不可能输入什么都能够得到正确的结果。或者对输入进行处理(截取合法部分、去掉非法部分等)。

本回答被提问者采纳
参考技术C 我认为你理解有误。

String类型本来长度就没有限制。所以不需要无线长度的类型。

而int有限制,所以需要BigInteger。

BigInteger本来就是处理整数的,不能处理字符。
参考技术D 巢成雏长大

Java中的大数处理类BigInteger和BigDecimar浅析

这两个类位于java.math包内,要使用它们必须在类前面引用该包:import java.math.BigInteger;和import java.math.BigDecimal;

BigInteger和BigDecimal分别表示不可变的任意精度的整数和不可变的有符号的任意精度的十进制数(浮点数)。主要用于高精度计算中。这两个类使得java中的大数,高精度运算变得很简单。

下面从几个方面对BigInteger和BigDecima做一个简单的比较:

 

一.常量

BigInteger:ONE,ZERO,TEN分别代表1,0,10.

其定义类似于:public static final BigInteger ONE = valueOf(1);

BigDecimal:除了以上三个常量外还有8个关于舍入的常量,这里不再赘述,可以去查看API的帮助手册.

顺便说一句,BigDecimal由于舍入模式的存在,使得这个类用起来比BigInteger要复杂.这里不再赘述,具体可以查看API的帮助手册,但是平时对起复杂特性用的不多,所以用的时候查阅API也是可行的.

 

二.声明赋值

BigInteger:BigInteger bi = new BigInteger("100");或:BigInteger bi = BigInteger.valueOf(100);

数组定义与基本类型类似.

BigDecimal:BigDecimal bd = new BigDecimal(100);或:BigDecimal bd = BigDecimal.valueOf(100);

BigDecimal的构造函数比BigInteger多一些,感觉用起来更方便些,比如这样定义就是错误的:BigInteger bi = new BigInteger(100);

顺便说一下,java.util包中的Scanner类实现了nextBigInteger()和nextBigDecimal()方法,可以用来读入控制台输入的BigInteger和BigDecimal.给个例子:

 

Java代码  
  1. Scanner sc = new Scanner(System.in);  
  2. while(sc.hasNext()){  
  3.     BigInteger bi;  
  4.     //BigDecimal bd;  
  5.     bi = sc.nextBigInteger();//读入BigInteger  
  6.     // bd = sc.nextBigDecimal();//读入BigDecimal  
  7.     System.out.println(bi.toString());  
  8.     //System.out.println(bd.toString());  
  9. }  

 

 

 

三.相关函数

主要介绍一下四则运算等函数:

用两个例子来说明比较直观一些:

BigInteger:

 

Java代码  
  1. package Factorial;  
  2.   
  3. import java.math.BigInteger;  
  4. import java.util.Random;  
  5. /** 
  6.  * 测试BigInteger类的一些函数 
  7.  * @author LY 2011-10-27 
  8.  * */  
  9. public class BigIntegerDemo {  
  10.     public static void main(String[] arguments){  
  11.         System.out.println("构造两个BigInteger对象: ");  
  12.         //BigInteger(int numBits, Random rnd)   
  13.         //构造一个随机生成的 BigInteger,它是在 0 到 (2^numBits - 1)(包括)范围内均匀分布的值  
  14.         BigInteger bi1 =  new BigInteger(55,new Random());  
  15.         System.out.println("bi1 = " + bi1);  
  16.           
  17.         //BigInteger(byte[] val)   
  18.         //将包含 BigInteger 的二进制补码表示形式的 byte 数组转换为 BigInteger。  
  19.         BigInteger bi2 = new BigInteger(new byte[]{3,2,3});  
  20.         System.out.println("bi2 = " + bi2);  
  21.           
  22.         //加  
  23.         System.out.println("bi1 + bi2 = " + bi1.add(bi2));  
  24.         //减  
  25.         System.out.println("bi1 - bi2 = " + bi1.subtract(bi2));  
  26.         //乘  
  27.         System.out.println("bi1 * bi2 = " + bi1.multiply(bi2));  
  28.         //指数运算  
  29.         System.out.println("bi1的2次方 = " + bi1.pow(2));  
  30.         //整数商  
  31.         System.out.println("bi1/bi2的整数商: " + bi1.divide(bi2));  
  32.         //余数  
  33.         System.out.println("bi1/bi2的余数: " + bi1.remainder(bi2));  
  34.         //整数商+余数  
  35.         System.out.println("bi1 / bi2 = " + bi1.divideAndRemainder(bi2)[0] +   
  36.                 "--" + bi1.divideAndRemainder(bi2)[1]);  
  37.         System.out.println("bi1 + bi2 = " + bi1.add(bi2));  
  38.         //比较大小,也可以用max()和min()  
  39.         if(bi1.compareTo(bi2) > 0)  
  40.   
  41.                System.out.println("bd1 is greater than bd2");  
  42.   
  43.            else if(bi1.compareTo(bi2) == 0)  
  44.   
  45.                System.out.println("bd1 is equal to bd2");  
  46.   
  47.            else if(bi1.compareTo(bi2) < 0)  
  48.   
  49.                System.out.println("bd1 is lower than bd2");  
  50.         //返回相反数  
  51.         BigInteger bi3 = bi1.negate();  
  52.         System.out.println("bi1的相反数: " + bi3);  
  53.         //返回绝对值  
  54.         System.out.println("bi1的绝对值:  " + bi3.abs());  
  55.     }  
  56.   
  57. }  

 

运行结果:

 

Java代码  
  1. 构造两个BigInteger对象:   
  2. bi1 = 8893838204110884  
  3. bi2 = 197123  
  4. bi1 + bi2 = 8893838204308007  
  5. bi1 - bi2 = 8893838203913761  
  6. bi1 * bi2 = 1753180068308949786732  
  7. bi1的2次方 = 79100358000902314326836967261456  
  8. bi1/bi2的整数商: 45118216565  
  9. bi1/bi2的余数: 168389  
  10. bi1 / bi2 = 45118216565--168389  
  11. bi1 + bi2 = 8893838204308007  
  12. bd1 is greater than bd2  
  13. bi1的相反数: -8893838204110884  
  14. bi1的绝对值:  8893838204110884  

 

BigDecimal:

 

Java代码  
  1. package Factorial;  
  2.   
  3. import java.math.BigDecimal;;  
  4. /** 
  5.  * 测试BigDecimal类的一些函数 
  6.  * @author LY 2011-10-27 
  7.  * */  
  8. public class BigDecimalDemo {  
  9.     public static void main(String[] arguments){  
  10.         System.out.println("构造两个BigDecimal对象: ");  
  11.         //用char[]数组创建BigDecimal对象,第二个参数为位移offset,  
  12.         //第三个参数指定长度  
  13.         BigDecimal bd1 = new BigDecimal("3464656776868432998434".toCharArray(),2,15);  
  14.         System.out.println("bd1 = " + bd1);  
  15.         //用double类型创建BigDecimal对象  
  16.         BigDecimal bd2 = new BigDecimal(134258767575867.0F);  
  17.         System.out.println("bd2 = " + bd2);  
  18.           
  19.         //加  
  20.         System.out.println("bd1 + bd2 = " + bd1.add(bd2));  
  21.         //减  
  22.         System.out.println("bd1 - bd2 = " + bd1.subtract(bd2));  
  23.         //乘  
  24.         System.out.println("bd1 * bd2 = " + bd1.multiply(bd2));  
  25.         //指数运算  
  26.         System.out.println("bd1的2次方 = " + bd1.pow(2));  
  27.         //取商的整数部分  
  28.         System.out.println("bd1/bd2的整数商: " + bd1.divideToIntegralValue(bd2));  
  29.         //返回余数计算为:this.subtract(this.divideToIntegralValue(divisor).multiply(divisor))  
  30.         //System.out.println(bd1.subtract(bd1.divideToIntegralValue(bd2).multiply(bd2)));  
  31.         System.out.println("bd1/bd2的余数: " + bd1.remainder(bd2));  
  32.         //取商和余,即bd1.divideToIntegralValue(bd2)与bd1.remainder(bd2)  
  33.         System.out.println("bd1 / bd2 = " + bd1.divideAndRemainder(bd2)[0] +   
  34.                 "--" + bd1.divideAndRemainder(bd2)[1]);  
  35.         //比较大小,也可以用max()和min()  
  36.         if(bd1.compareTo(bd2) > 0)  
  37.   
  38.                System.out.println("bd1 is greater than bd2");  
  39.   
  40.            else if(bd1.compareTo(bd2) == 0)  
  41.   
  42.                System.out.println("bd1 is equal to bd2");  
  43.   
  44.            else if(bd1.compareTo(bd2) < 0)  
  45.   
  46.                System.out.println("bd1 is lower than bd2");  
  47.         //末位数据精度  
  48.         System.out.println("bd1的末位数据精度:  " + bd1.ulp());  
  49.           
  50.     }  
  51.   
  52. }  

 

运行结果:

 

Java代码  
  1. 构造两个BigDecimal对象:   
  2. bd1 = 646567768684329  
  3. bd2 = 134258765070336  
  4. bd1 + bd2 = 780826533754665  
  5. bd1 - bd2 = 512309003613993  
  6. bd1 * bd2 = 86807390157840676971865964544  
  7. bd1的2次方 = 418049879501431972683650180241  
  8. bd1/bd2的整数商: 4  
  9. bd1/bd2的余数: 109532708402985  
  10. bd1 / bd2 = 4--109532708402985  
  11. bd1 is greater than bd2  
  12. bd1的末位数据精度:  1  

 

本文对BigInteger和BigDecimal类进行了比较浅显的介绍及比较,如对这两个类有兴趣,可以查阅API或研读其源码.

 

原文:http://ly5633.iteye.com/blog/1218724

以上是关于JAVA大数类库初始化BigInteger问题的主要内容,如果未能解决你的问题,请参考以下文章

大数运算之 Java BigInteger 的基本用法

Java中的大数处理类BigInteger和BigDecimar浅析

JAVA 大数阶乘,不用biginteger怎么做

Java大数类 BigInteger

Java大数BigInteger-用法记录

不使用BigInteger类实现大数相加(Java)