以下是摘抄与其他人的:  

JAVA之BigInteger

Java来处理高精度问题,相信对很多ACMer来说都是一件很happy的事,简单易懂。用Java刷了一些题,感觉Java还不错,在处理高精度和进制转换中,调用库函数的来处理。下面是写的一些Java中一些基本的函数的及其……

头文件:import java.io.*;

import java.util.*;

import java.math.*;

读入: Scanner cin = Scanner (System.in);

while(cin.hasNext())//等价于!=EOF

n=cin.nextInt();//读入一个int型的数

n=cin.nextBigInteger();//读入一个大整数

输出: System.out.print(n);//打印n

System.out.println();//换行

System.out.printf("%d\n",n);//也可以类似c++里的输出方式

定义: int i,j,k,a[];

a = new int[100];

BigInteger n,m;

BigDecimal n;

String s;

数据类型:

数据类型 类型名 位长 取值范围 默认值

布尔型 boolean 1 true,false false

字节型 byte 8 -128-127 0

字符型 char 16 ‘\u000’-\uffff ‘\u0000’

短整型 short 16 -32768-32767 0

整型 int 32 -2147483648,2147483647 0

长整型 long 64 -9.22E18,9.22E18 0

浮点型 float 32 1.4E-45-3.4028E+38 0.0

双精度型 double 64 4.9E-324,1.7977E+308 0.0

这里特别要提出出的两种类型:

BigInteger 任意大的整数,原则上是,只要你的计算机的内存足够大,可以有无限位的

BigInteger 任意大的实数,可以处理小数精度问题。

BigInteger中一些常见的函数:

A=BigInteger.ONE

B=BigInteger.TEN

C=BigInteger.ZERO

一些常见的数的赋初值。将int型的数赋值给BigInteger,BigInteger.valueOf(k);

基本的函数:

valueOf:赋初值

add:+ a.add(b);

subtract:-

multiply:*

divide:/

remainder:this % val

divideAndRemainder:a[0]=this / val; a[1]=this % val

pow:a.pow(b)=a^b

gcd,abs:公约数,绝对值

negate:取负数

signum:符号函数

mod:a.mod(b)=a%b;

shiftLeft:左移,this << n ,this*2^n;

shiftRight:右移,this >> n,this/2^n;

and:等同于c++的&&,且;

or:||,或;

xor:异或,BigInteger xor(BigInteger val),this^val

not:!,非;

bitLength:返回该数的最小二进制补码表示的位的个数,即 *不包括* 符号位 (ceil(log2(this <0 ? -this : this + 1)))。对正数来说,这等价于普通二进制表示的位的个数。

bitCount:返回该数的二进制补码表示中不包扩符号位在内的位的个数。该方法在 BigIntegers 之上实现位向量风格的集合时很有用。

isProbablePrime:如果该 BigInteger 可能是素数,则返回 true ;如果它很明确是一个合数,则返回 false 。 参数 certainty 是对调用者愿意忍受的不确定性的度量:如果该数是素数的概率超过了 1 - 1/2**certainty方法,则该方法返回 true 。执行时间正比于参数确定性的值。

compareTo:根据该数值是小于、等于、或大于 val 返回 -1、0 或 1;

equals:判断两数是否相等,也可以用compareTo来代替;

min,max:取两个数的较小、大者;

intValue,longValue,floatValue,doublue:把该数转换为该类型的数的值。

今天参考课本写了一个关于二进制与十进制转换的程序,程序算法不难,但写完后测试发现不论是二转十还是十转二,对于大于21亿即超过整数范围的数不能很好的转换。都会变成0.
参考书籍发现使用使用BigInteger可以解决这个问题。
于是查找了下JDK,然后测试几次终于写成功了!
使用心得如下:

1,BigInteger属于java.math.BigInteger,因此在每次使用前都要import 这个类。偶开始就忘记import了,于是总提示找不到提示符。

2,其构造方法有很多,但现在偶用到的有: BigInteger(String val)
将 BigInteger 的十进制字符串表示形式转换为 BigInteger。
BigInteger(String val, int radix)
将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger。
如要将int型的2转换为BigInteger型,要写为BigInteger two=new BigInteger("2"); //注意2双引号不能省略

3,BigInteger类模拟了所有的int型数学操作,如add()==“+”,divide()==“-”等,但注意其内容进行数学运算时不能直接使用数学运算符进行运算,必须使用其内部方法。而且其操作数也必须为BigInteger型。
如:two.add(2)就是一种错误的操作,因为2没有变为BigInteger型。

4,当要把计算结果输出时应该使用.toString方法将其转换为10进制的字符串,详细说明如下:
String toString()
返回此 BigInteger 的十进制字符串表示形式。
输出方法:System.out.print(two.toString());

5,另外说明三个个用到的函数。 BigInteger remainder(BigInteger val)
返回其值为 (this % val) 的 BigInteger。
BigInteger negate()
返回其值是 (-this) 的 BigInteger。
int compareTo(BigInteger val)
将此 BigInteger 与指定的 BigInteger 进行比较。
remainder用来求余数。
negate将操作数变为相反数。
compare的详解如下:

compareTo
public int compareTo(BigInteger val)将此 BigInteger 与指定的 BigInteger 进行比较。对于针对六个布尔比较运算符 (<, ==, >, >=, !=, <=) 中的每一个运算符的各个方法,优先提供此方法。执行这些比较的建议语句是:(x.compareTo(y) <op> 0),其中 <op> 是六个比较运算符之一。
指定者:
接口 Comparable<BigInteger> 中的 compareTo
参数:
val - 将此 BigInteger 与之比较的 BigInteger。
返回:

将BigInteger的数转为2进制:

public class TestChange {
public static void main(String[] args) {
System.out.println(change("3",10,2));
}
//num 要转换的数 from源数的进制 to要转换成的进制
private static String change(String num,int from, int to){
return new java.math.BigInteger(num, from).toString(to);
}
}

其中以实现 Fibonacci数列 进行练习

问题描述

Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。

当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

输入格式
输入包含一个整数n。
输出格式
输出一行,包含一个整数,表示Fn除以10007的余数。

说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。

样例输入
10
样例输出
55
样例输入
22
样例输出
7704
数据规模与约定
1 <= n <= 1,000,000。
 
解:一下是用的数组方式实现

import java.util.Scanner;
import java.math.BigInteger;

public class BigIntegerFibnaccui {
public static void main(String[] args) {

Scanner sc= new Scanner(System.in);
int num = sc.nextInt();

int[] resultInt = new int[num];
resultInt[0] = 1;
resultInt[1] = 1;

long[] resultLong = new long[num];
resultLong[0] = 1L;
resultLong[1] = 1L;

BigInteger[] resultBigInteger = new BigInteger[num];
resultBigInteger[0] = BigInteger.ONE;
resultBigInteger[1] = BigInteger.ONE;
for (int i = 2; i < num; i++) {
resultInt[i] = resultInt[i - 1] + resultInt[i - 2];
resultLong[i] = resultLong[i - 1] + resultLong[i - 2];
resultBigInteger[i] = resultBigInteger[i - 1].add(resultBigInteger[i - 2]);
}

System.out.println("--------------------output int---------------------");
for (int i = 0; i < resultInt.length; i++) {
System.out.println("resultInt[" + i + "] = "+ resultInt[i]);
}

System.out.println("--------------------output long---------------------");
for (int i = 0; i < resultLong.length; i++) {
System.out.println("resultLong[" + i + "] = "+ resultLong[i]);
}

System.out.println("--------------------output bigInteger---------------------");
for (int i = 0; i < resultBigInteger.length; i++) {
System.out.println("resultBigInteger[" + i + "] = "+ resultBigInteger[i]);
}
}
}

心得:

初看这道题很简单,我们只需要设定一个数组,然后往里面放入对应的值,除了前两个数字位,后面每个数字位都是前两个数字位的和。刚开始我用了int数组来存放这组数,发现根本放不下去,到了第47位数的时候就存在数值溢出了,然后我换为long型数组,同样放不下去,到了第93位数的时候也存在数值溢出了。这样,只能用BigInteger类了,这是java提供的可以存储任意精度的整数的类,用它我们不需要考虑数值溢出的错误。即使我们求第1000个数值也没有什么问题。不过,它的数值运算必须以方法调用方式取代运算符方式来实现,由于这么做复杂了许多,运算速度会比较慢,所以在确定数值不会溢出的情况下,是不推荐用这种型式来进行数值存储和运算的。

结果:

100
--------------------output int---------------------
resultInt[0] = 1
resultInt[1] = 1
resultInt[2] = 2
resultInt[3] = 3
resultInt[4] = 5
resultInt[5] = 8
resultInt[6] = 13
resultInt[7] = 21
resultInt[8] = 34
resultInt[9] = 55
resultInt[10] = 89
resultInt[11] = 144
resultInt[12] = 233
resultInt[13] = 377
resultInt[14] = 610
resultInt[15] = 987
resultInt[16] = 1597
resultInt[17] = 2584
resultInt[18] = 4181
resultInt[19] = 6765
resultInt[20] = 10946
resultInt[21] = 17711
resultInt[22] = 28657
resultInt[23] = 46368
resultInt[24] = 75025
resultInt[25] = 121393
resultInt[26] = 196418
resultInt[27] = 317811
resultInt[28] = 514229
resultInt[29] = 832040
resultInt[30] = 1346269
resultInt[31] = 2178309
resultInt[32] = 3524578
resultInt[33] = 5702887
resultInt[34] = 9227465
resultInt[35] = 14930352
resultInt[36] = 24157817
resultInt[37] = 39088169
resultInt[38] = 63245986
resultInt[39] = 102334155
resultInt[40] = 165580141
resultInt[41] = 267914296
resultInt[42] = 433494437
resultInt[43] = 701408733
resultInt[44] = 1134903170
resultInt[45] = 1836311903
resultInt[46] = -1323752223
resultInt[47] = 512559680
resultInt[48] = -811192543
resultInt[49] = -298632863
resultInt[50] = -1109825406
resultInt[51] = -1408458269
resultInt[52] = 1776683621
resultInt[53] = 368225352
resultInt[54] = 2144908973
resultInt[55] = -1781832971
resultInt[56] = 363076002
resultInt[57] = -1418756969
resultInt[58] = -1055680967
resultInt[59] = 1820529360
resultInt[60] = 764848393
resultInt[61] = -1709589543
resultInt[62] = -944741150
resultInt[63] = 1640636603
resultInt[64] = 695895453
resultInt[65] = -1958435240
resultInt[66] = -1262539787
resultInt[67] = 1073992269
resultInt[68] = -188547518
resultInt[69] = 885444751
resultInt[70] = 696897233
resultInt[71] = 1582341984
resultInt[72] = -2015728079
resultInt[73] = -433386095
resultInt[74] = 1845853122
resultInt[75] = 1412467027
resultInt[76] = -1036647147
resultInt[77] = 375819880
resultInt[78] = -660827267
resultInt[79] = -285007387
resultInt[80] = -945834654
resultInt[81] = -1230842041
resultInt[82] = 2118290601
resultInt[83] = 887448560
resultInt[84] = -1289228135
resultInt[85] = -401779575
resultInt[86] = -1691007710
resultInt[87] = -2092787285
resultInt[88] = 511172301
resultInt[89] = -1581614984
resultInt[90] = -1070442683
resultInt[91] = 1642909629
resultInt[92] = 572466946
resultInt[93] = -2079590721
resultInt[94] = -1507123775
resultInt[95] = 708252800
resultInt[96] = -798870975
resultInt[97] = -90618175
resultInt[98] = -889489150
resultInt[99] = -980107325
--------------------output long---------------------

resultLong[0] = 1
resultLong[1] = 1
resultLong[2] = 2
resultLong[3] = 3
resultLong[4] = 5
resultLong[5] = 8
resultLong[6] = 13
resultLong[7] = 21
resultLong[8] = 34
resultLong[9] = 55
resultLong[10] = 89
resultLong[11] = 144
resultLong[12] = 233
resultLong[13] = 377
resultLong[14] = 610
resultLong[15] = 987
resultLong[16] = 1597
resultLong[17] = 2584
resultLong[18] = 4181
resultLong[19] = 6765
resultLong[20] = 10946
resultLong[21] = 17711
resultLong[22] = 28657
resultLong[23] = 46368
resultLong[24] = 75025
resultLong[25] = 121393
resultLong[26] = 196418
resultLong[27] = 317811
resultLong[28] = 514229
resultLong[29] = 832040
resultLong[30] = 1346269
resultLong[31] = 2178309
resultLong[32] = 3524578
resultLong[33] = 5702887
resultLong[34] = 9227465
resultLong[35] = 14930352
resultLong[36] = 24157817
resultLong[37] = 39088169
resultLong[38] = 63245986
resultLong[39] = 102334155
resultLong[40] = 165580141
resultLong[41] = 267914296
resultLong[42] = 433494437
resultLong[43] = 701408733
resultLong[44] = 1134903170
resultLong[45] = 1836311903
resultLong[46] = 2971215073
resultLong[47] = 4807526976
resultLong[48] = 7778742049
resultLong[49] = 12586269025
resultLong[50] = 20365011074
resultLong[51] = 32951280099
resultLong[52] = 53316291173
resultLong[53] = 86267571272
resultLong[54] = 139583862445
resultLong[55] = 225851433717
resultLong[56] = 365435296162
resultLong[57] = 591286729879
resultLong[58] = 956722026041
resultLong[59] = 1548008755920
resultLong[60] = 2504730781961
resultLong[61] = 4052739537881
resultLong[62] = 6557470319842
resultLong[63] = 10610209857723
resultLong[64] = 17167680177565
resultLong[65] = 27777890035288
resultLong[66] = 44945570212853
resultLong[67] = 72723460248141
resultLong[68] = 117669030460994
resultLong[69] = 190392490709135
resultLong[70] = 308061521170129
resultLong[71] = 498454011879264
resultLong[72] = 806515533049393
resultLong[73] = 1304969544928657
resultLong[74] = 2111485077978050
resultLong[75] = 3416454622906707
resultLong[76] = 5527939700884757
resultLong[77] = 8944394323791464
resultLong[78] = 14472334024676221
resultLong[79] = 23416728348467685
resultLong[80] = 37889062373143906
resultLong[81] = 61305790721611591
resultLong[82] = 99194853094755497
resultLong[83] = 160500643816367088
resultLong[84] = 259695496911122585
resultLong[85] = 420196140727489673
resultLong[86] = 679891637638612258
resultLong[87] = 1100087778366101931
resultLong[88] = 1779979416004714189
resultLong[89] = 2880067194370816120
resultLong[90] = 4660046610375530309
resultLong[91] = 7540113804746346429
resultLong[92] = -6246583658587674878
resultLong[93] = 1293530146158671551
resultLong[94] = -4953053512429003327
resultLong[95] = -3659523366270331776
resultLong[96] = -8612576878699335103
resultLong[97] = 6174643828739884737
resultLong[98] = -2437933049959450366
resultLong[99] = 3736710778780434371

--------------------output bigInteger---------------------

resultBigInteger[0] = 1
resultBigInteger[1] = 1
resultBigInteger[2] = 2
resultBigInteger[3] = 3
resultBigInteger[4] = 5
resultBigInteger[5] = 8
resultBigInteger[6] = 13
resultBigInteger[7] = 21
resultBigInteger[8] = 34
resultBigInteger[9] = 55
resultBigInteger[10] = 89
resultBigInteger[11] = 144
resultBigInteger[12] = 233
resultBigInteger[13] = 377
resultBigInteger[14] = 610
resultBigInteger[15] = 987
resultBigInteger[16] = 1597
resultBigInteger[17] = 2584
resultBigInteger[18] = 4181
resultBigInteger[19] = 6765
resultBigInteger[20] = 10946
resultBigInteger[21] = 17711
resultBigInteger[22] = 28657
resultBigInteger[23] = 46368
resultBigInteger[24] = 75025
resultBigInteger[25] = 121393
resultBigInteger[26] = 196418
resultBigInteger[27] = 317811
resultBigInteger[28] = 514229
resultBigInteger[29] = 832040
resultBigInteger[30] = 1346269
resultBigInteger[31] = 2178309
resultBigInteger[32] = 3524578
resultBigInteger[33] = 5702887
resultBigInteger[34] = 9227465
resultBigInteger[35] = 14930352
resultBigInteger[36] = 24157817
resultBigInteger[37] = 39088169
resultBigInteger[38] = 63245986
resultBigInteger[39] = 102334155
resultBigInteger[40] = 165580141
resultBigInteger[41] = 267914296
resultBigInteger[42] = 433494437
resultBigInteger[43] = 701408733
resultBigInteger[44] = 1134903170
resultBigInteger[45] = 1836311903
resultBigInteger[46] = 2971215073
resultBigInteger[47] = 4807526976
resultBigInteger[48] = 7778742049
resultBigInteger[49] = 12586269025
resultBigInteger[50] = 20365011074
resultBigInteger[51] = 32951280099
resultBigInteger[52] = 53316291173
resultBigInteger[53] = 86267571272
resultBigInteger[54] = 139583862445
resultBigInteger[55] = 225851433717
resultBigInteger[56] = 365435296162
resultBigInteger[57] = 591286729879
resultBigInteger[58] = 956722026041
resultBigInteger[59] = 1548008755920
resultBigInteger[60] = 2504730781961
resultBigInteger[61] = 4052739537881
resultBigInteger[62] = 6557470319842
resultBigInteger[63] = 10610209857723
resultBigInteger[64] = 17167680177565
resultBigInteger[65] = 27777890035288
resultBigInteger[66] = 44945570212853
resultBigInteger[67] = 72723460248141
resultBigInteger[68] = 117669030460994
resultBigInteger[69] = 190392490709135
resultBigInteger[70] = 308061521170129
resultBigInteger[71] = 498454011879264
resultBigInteger[72] = 806515533049393
resultBigInteger[73] = 1304969544928657
resultBigInteger[74] = 2111485077978050
resultBigInteger[75] = 3416454622906707
resultBigInteger[76] = 5527939700884757
resultBigInteger[77] = 8944394323791464
resultBigInteger[78] = 14472334024676221
resultBigInteger[79] = 23416728348467685
resultBigInteger[80] = 37889062373143906
resultBigInteger[81] = 61305790721611591
resultBigInteger[82] = 99194853094755497
resultBigInteger[83] = 160500643816367088
resultBigInteger[84] = 259695496911122585
resultBigInteger[85] = 420196140727489673
resultBigInteger[86] = 679891637638612258
resultBigInteger[87] = 1100087778366101931
resultBigInteger[88] = 1779979416004714189
resultBigInteger[89] = 2880067194370816120
resultBigInteger[90] = 4660046610375530309
resultBigInteger[91] = 7540113804746346429
resultBigInteger[92] = 12200160415121876738
resultBigInteger[93] = 19740274219868223167
resultBigInteger[94] = 31940434634990099905
resultBigInteger[95] = 51680708854858323072
resultBigInteger[96] = 83621143489848422977
resultBigInteger[97] = 135301852344706746049
resultBigInteger[98] = 218922995834555169026
resultBigInteger[99] = 354224848179261915075
请按任意键继续. . .

如上可以见:用BigInteger不会出现负数形式!

学习 BigInteger的更多相关文章

  1. Java学习——BigInteger类和BigDecimal类

    Java学习——BigInteger类和BigDecimal类 摘要:本文主要学习了用于大数字运算的BigInteger类和BigDecimal类. 部分内容来自以下博客: https://www.c ...

  2. 拯救你丢失的精度——BigInteger和BigDecimal类(入门)

    第三阶段 JAVA常见对象的学习 BigInteger和BigDecimal类 BigInteger类 (一) 构造方法: //针对超过整数范围的运算(整数最大值:2147483647) BigInt ...

  3. java BigInteger源码学习

    转载自http://www.hollischuang.com/archives/176 在java中,有很多基本数据类型我们可以直接使用,比如用于表示浮点型的float.double,用于表示字符型的 ...

  4. Java学习笔记26(Math类、Arrays类、BigInteger类、BigDecimal类)

    Math类:数学工具类,做一些数学计算,开方,对数,三角函数等 所有方法都是静态方法,不需要建立对象,直接用类名调用即可 示例: 这里写几个在日常开发中会用到的,比如三角函数之类的平时不会用到,了解即 ...

  5. 软件工程第三周的学习报告 html<input> final finally finalize 的比较 BigInteger

    三月十三号下午: html的<input>的三个属性pattern(限定用户的输入格式)与placeholder(显示的)与required(不能为空) 代码案例: pattern与pla ...

  6. Java基础学习笔记之:System类;Math类;Arrays类BigInteger,BigDecimal

    System类 在API中System类介绍的比较简单,我们给出定义,System中代表程序所在系统,提供了对应的一些系统属性信息,和系统操作.System类不能手动创建对象,因为构造方法被priva ...

  7. 零基础学习java------day12------数组高级(选择排序,冒泡排序,二分查找),API(Arrays工具类,包装类,BigInteger等数据类型,Math包)

    0.数组高级 (1)选择排序 它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的起始位置 ...

  8. 【java】学习路径22-关于BigInteger类,大数字类

    //int ooo = 19999999999999; //long ooo = 19999999999999; //这么大的整数,int和long都存不下的时候,我们就使用Math类下的BigInt ...

  9. Java学习笔记(四)

    字符串 字符串应用主要分为String类操作与字符串生成器 在程序中频繁的进行附加字符串则使用字符串生成器StringBuilder 数组 概述 数组是具有相同数据类型的一组数据的集合 数组创建 先声 ...

随机推荐

  1. HackerRank Ice Cream Parlor

    传送门 Ice Cream Parlor Authored by dheeraj on Mar 21 2013 Problem Statement Sunny and Johnny together ...

  2. MySQL: Starting MySQL….. ERROR! The server quit without updating PID file解决办法

    MySQL: Starting MySQL….. ERROR! The server quit without updating PID file解决办法 1 问题 [root@localhost m ...

  3. JAVA HTTP请求 常用的代理设置

    由于公司上网实行代理机制, 而最近一段时间又在研究Web上的OpenApi. 没办法一定要使用代理,我之前有文章介绍了httpclient的代理使用方式, 这里介绍基本java的代理使用方式. 最常使 ...

  4. strstr 函数用法

    strstr 编辑 strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串.如果是,则该函数返回str2在str1中首次出现的地址:否则,返回NULL. C语言函数 编辑 ...

  5. 一个不安装Oracle客户端的方法------未经试验

    (一)不安装客户端的解决办法.第一种方法:1.在安装ORACLE服务器的机器上搜索下列文件,oci.dllocijdbc10.dllociw32.dllorannzsbb10.dlloraocci10 ...

  6. 优化sql语句

    关于数据库sql语句的优化? 这个链接可以看 涉及数据库的操作基本都是变得很慢了, 所以通常说数据库是程序的瓶颈 测试/优化数据库/sql的方法: 把order排序.where条件等一个一个去除法来做 ...

  7. HDOJ 2089 不要62

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. 详解JavaScript中的Url编码/解码,表单提交中网址编码

    本文主要针对URI编解码的相关问题做了介绍,对Url编码中哪些字符需要编码.为什么需要编码做了详细的说明,并对比分析了Javascript 中和 编解码相关的几对函数escape / unescape ...

  9. Linux 4.6分支已到生命尽头 请尽快升级至Linux 4.7.1

    导读 在Linux Kernel 4.7首个维护版本发布的同时,Greg Kroah-Hartman同时也向社区发布了Linux Kernel 4.6.7版本.作为Linux 4.6分支的第7个维护版 ...

  10. change column to bigint

    今天存储数据的时候报错,发现是3435065640超出了常规int的存储长度, RangeError (3435065640 is out of range for ActiveRecord::Typ ...