Java大数类 BigInteger
package bigint; /**
* This class encapsulates a BigInteger, i.e. a positive or negative integer
* with any number of digits, which overcomes the computer storage length
* limitation of an integer.
*
*/
public class BigInteger { /**
* True if this is a negative integer
*/
boolean negative; /**
* Number of digits in this integer
*/
int numDigits; /**
* Reference to the first node of this integer's linked list representation
* NOTE: The linked list stores the Least Significant Digit in the FIRST node.
* For instance, the integer 235 would be stored as: 5 --> 3 --> 2
*
* Insignificant digits are not stored. So the integer 00235 will be stored as:
* 5 --> 3 --> 2 (No zeros after the last 2)
*/
DigitNode front; /**
* Initializes this integer to a positive number with zero digits, in other
* words this is the 0 (zero) valued integer.
*/
public BigInteger() {
negative = false;
numDigits = 0;
front = null;
} /**
* Parses an input integer string into a corresponding BigInteger instance. A
* correctly formatted integer would have an optional sign as the first
* character (no sign means positive), and at least one digit character
* (including zero). Examples of correct format, with corresponding values
* Format Value +0 0 -0 0 +123 123 1023 1023 0012 12 0 0 -123 -123 -001 -1 +000
* 0
*
* Leading and trailing spaces are ignored. So " +123 " will still parse
* correctly, as +123, after ignoring leading and trailing spaces in the input
* string.
*
* Spaces between digits are not ignored. So "12 345" will not parse as an
* integer - the input is incorrectly formatted.
*
* An integer with value 0 will correspond to a null (empty) list - see the
* BigInteger constructor
*
* @param integer Integer string that is to be parsed
* @return BigInteger instance that stores the input integer.
* @throws IllegalArgumentException If input is incorrectly formatted
*/
public static BigInteger parse(String integer) throws IllegalArgumentException { boolean f = false;
/* IMPLEMENT THIS METHOD */
int len = integer.length();
StringBuffer buffer = new StringBuffer(integer).reverse();
char[] cs = buffer.toString().toCharArray();
DigitNode head = null;
DigitNode node1 = new DigitNode(0, null);
DigitNode node2 = new DigitNode(0, null);
head = node1;
for (int i = 0; i < len; i++) {
if (cs[i] == '-') {
f = true;
len--;
continue;
}
if(cs[i] == '+') {
len--;
continue;
}
if (Character.isDigit(cs[i])) {
node2 = new DigitNode(cs[i] - '0', null);
node1.next = node2;
node1 = node2;
} else {
throw new IllegalArgumentException("Incorrect Format");
} }
BigInteger integer2 = new BigInteger();
integer2.front = head.next;
integer2.numDigits = len;
integer2.negative = f;
// following line is a placeholder for compilation
return integer2;
} private static void printList(DigitNode head) {
while (head != null) {
System.out.print(head.digit + " ");
head = head.next;
}
} /**
* Adds the first and second big integers, and returns the result in a NEW
* BigInteger object. DOES NOT MODIFY the input big integers.
*
* NOTE that either or both of the input big integers could be negative. (Which
* means this method can effectively subtract as well.)
*
* @param first First big integer
* @param second Second big integer
* @return Result big integer
*/
public static BigInteger add(BigInteger first, BigInteger second) { /* IMPLEMENT THIS METHOD */
BigInteger bigc = new BigInteger();
bigc.front = new DigitNode(0, null);
int carry = 0;
DigitNode a = (first.front);
DigitNode b = (second.front);
DigitNode head = bigc.front;
DigitNode c = bigc.front;
BigInteger d = null;
for (int i = 0; i < first.numDigits || i < second.numDigits; i++) {
if(b==null) {
b=new DigitNode(0, null);
}
int temp = carry + a.digit + b.digit;
c.digit = temp % 10;
bigc.numDigits++;
d = new BigInteger();
d.front = new DigitNode(0, null);
c.next = d.front;
c = d.front;
carry = temp / 10;
a = a.next;
b = b.next;
} if (carry != 0) {
c.digit = carry;
bigc.numDigits++;
}
bigc.negative=first.negative==second.negative?false:true;
bigc.front = head;
// following line is a placeholder for compilation
return bigc;
} public static DigitNode reverseList(DigitNode head) {
if (head == null || head.next == null)
return head;
DigitNode pre = head;
DigitNode cur = head.next; while (cur != null) {
DigitNode temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
} head.next = null;
return head; } /**
* Returns the BigInteger obtained by multiplying the first big integer with the
* second big integer
*
* This method DOES NOT MODIFY either of the input big integers
*
* @param first First big integer
* @param second Second big integer
* @return A new BigInteger which is the product of the first and second big
* integers
*/
public static BigInteger multiply(BigInteger first, BigInteger second) {
DigitNode front2 = second.front;
String retval = front2.digit + "";
for (DigitNode curr = front2.next; curr != null; curr = curr.next) {
if (curr.digit == 0)
continue;
retval = curr.digit + retval;
}
int b=Integer.parseInt(retval);
DigitNode a = (first.front);
BigInteger bigc=new BigInteger();
bigc.front = new DigitNode(0, null);
BigInteger d = null;
DigitNode c = bigc.front;
int carry=0;
for(int i=0;i<first.numDigits;i++){
int temp=a.digit*b+carry;
c.digit=temp%10;
bigc.numDigits++;
d = new BigInteger();
d.front = new DigitNode(0, null);
c.next = d.front;
c = d.front;
carry=temp/10;
a = a.next;
}
while(carry!=0){//乘法的进位可能不止一位
c.digit=carry%10;
bigc.numDigits++;
d = new BigInteger();
d.front = new DigitNode(0, null);
c.next = d.front;
c = d.front;
carry/=10;
}
bigc.negative=first.negative==second.negative?false:true;
// return c;
// following line is a placeholder for compilation
return bigc;
}
public static void main(String[] args) {
BigInteger parse = BigInteger.parse("123");
} public boolean StrToInteger(String str) {
StringBuffer buffer = new StringBuffer(str);
for(int i=0;i<buffer.length();i++) {
if(buffer.charAt(i)=='0') {
return false;
}
}
return true; } /*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
public String toString() {
if (front == null) {
return "0";
}
String retval = front.digit + "";
for (DigitNode curr = front.next; curr != null; curr = curr.next) {
//if (curr.digit == 0&&Integer.parseInt(retval)!=0)
if (curr.digit == 0&&StrToInteger(retval))
continue;
retval = curr.digit + retval;
} if (negative) {
retval = '-' + retval;
}
return retval;
}
}
package bigint; import java.io.IOException;
import java.util.Scanner; public class BigTest { static Scanner sc; public static void parse()
throws IOException {
System.out.print("\tEnter integer => ");
String integer = sc.nextLine();
try {
BigInteger bigInteger = BigInteger.parse(integer);
System.out.println("\t\tValue = " + bigInteger);
} catch (IllegalArgumentException e) {
System.out.println("\t\tIncorrect Format");
}
} public static void add()
throws IOException {
System.out.print("\tEnter first integer => ");
String integer = sc.nextLine();
BigInteger firstBigInteger = BigInteger.parse(integer); System.out.print("\tEnter second integer => ");
integer = sc.nextLine();
BigInteger secondBigInteger = BigInteger.parse(integer); BigInteger result = BigInteger.add(firstBigInteger,secondBigInteger);
System.out.println("\t\tSum: " + result);
} public static void multiply()
throws IOException {
System.out.print("\tEnter first integer => ");
String integer = sc.nextLine();
BigInteger firstBigInteger = BigInteger.parse(integer); System.out.print("\tEnter second integer => ");
integer = sc.nextLine();
BigInteger secondBigInteger = BigInteger.parse(integer); BigInteger result = BigInteger.multiply(firstBigInteger,secondBigInteger);
System.out.println("\t\tProduct: " + result); } public static void main(String[] args)
throws IOException { // TODO Auto-generated method stub
sc = new Scanner(System.in); char choice;
while ((choice = getChoice()) != 'q') {
switch (choice) {
case 'p' : parse(); break;
case 'a' : add(); break;
case 'm' : multiply(); break;
default: System.out.println("Incorrect choice");
}
}
} private static char getChoice() {
System.out.print("\n(p)arse, (a)dd, (m)ultiply, or (q)uit? => ");
String in = sc.nextLine();
char choice;
if (in == null || in.length() == 0) {
choice = ' ';
} else {
choice = in.toLowerCase().charAt(0);
}
return choice;
} }
package bigint; /**
* This class encapsulates a linked list for a digit of a big integer.
*
* @author Sesh Venugopal (RU NB CS 112)
*
*/
public class DigitNode {
/**
* The digit
*/
int digit; /**
* Pointer to next digit in the linked list
*/
DigitNode next; /**
* Initializes this digit node with a digit and next pointer
*
* @param digit Digit
* @param next Next pointer
*/
DigitNode(int digit, DigitNode next) {
this.digit = digit;
this.next = next;
} /* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString() {
return digit + "";
}
}
Java大数类 BigInteger的更多相关文章
- Java 大数类BigInteger和BigDecimal的基本函数
在Java中有两个类BigInteger和BigDecimal分别表示不可变的任意精度的整数和不可变的有符号的任意精度的十进制数(浮点数).主要用于高精度计算中.这两个类使得java中的大数,高精度运 ...
- JAVA大数类
JAVA大数类api http://man.ddvip.com/program/java_api_zh/java/math/BigInteger.html#method_summary 不仅仅只能查J ...
- ZOJ3477&JAVA大数类
转:http://blog.csdn.net/sunkun2013/article/details/11822927 import java.util.*; import java.math.BigI ...
- JAVA - 大数类详解
写在前面 对于ACMer来说,java语言最大的优势就是BigInteger,Bigdecimal,String三个类. 这三个类分别是高精度整数,高精度浮点数和字符串,之所以说这个是它的优势是因为j ...
- JAVA大数类练手
今天突然看到了OJ上的大数类题目,由于学习了一点大数类的知识.果断水了6道题......都是非常基础的.就当的练手的吧. 学到的只是一些大数类的基本操作.以后多做点这样的题,争取熟练运用水大数题... ...
- Java大数类介绍
java能处理大数的类有两个高精度大整数BigInteger 和高精度浮点数BigDecimal,这两个类位于java.math包内,要使用它们必须在类前面引用该包:import java.math. ...
- HDU高精度总结(java大数类)
HDU1002 A + B Problem II [题意]大数相加 [链接]http://acm.hdu.edu.cn/showproblem.php?pid=1002 Sample Inpu ...
- JAVA大数处理(BigInteger,BigDecimal)
原文链接 Java中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类. 这两个类都在java.math.*包中,因此每次必须在开头处引用该包. Ⅰ基本函数: 1.valu ...
- JAVA大数类—基础操作(加减乘除、取模、四舍五入、设置保留位数)
当基础数据类型长度无法满足需求时可以使用大数类 构造方法接受字符串为参数 BigInteger bInt = new BigInteger("123123"); BigDecima ...
随机推荐
- Java_百钱买百鸡
题目:公鸡3文钱,母鸡2文钱,3只小鸡1文钱,百钱买百鸡,求多少公鸡,母鸡,小鸡? public class Work6{ public static void main(String[] args) ...
- docker拉取慢(net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting head)
systemctl restart docker在docker-hub拉取慢,因为服务器在外网 直接配置阿里云镜像就可以 首先: vim /etc/docker/daemon.json加入下面的那句 ...
- numpy输出有省略号的问题
发现很多文章都说加一句 np.set_printoptions(threshold="nan") 或者 np.set_printoptions(threshold=np.nan) ...
- linux服务器JDK1.8环境变量配置
1. 场景描述 软件老王年龄大了,新机器(Linxu)下,配置JDK环境变量老记不住,记录下,有需要的朋友参考下. 2. 解决方案 2.1 上传tar包 ftp上传tar包: jdk-8u181-li ...
- React的setState学习及应用
React的setState学习及应用 一:作用: setState() 将对组件 state 的更改排入队列,并通知 React 需要使用更新后的 state 重新渲染此组件及其子组件.这是用于更新 ...
- Java内存区域与内存溢出异常,对象的创建
一.运行时数据区域 Java程序的执行流程:首先 .java源代码文件会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执 ...
- 简约清新立体商务年终工作总结汇报动态PPT模板
模版来源:http://ppt.dede58.com/gongzuohuibao/26682.html
- My97DatePicker-WdatePicker日历日期插件详细示例
<!DOCTYPE html> <html> <head> <title>排行</title> <meta charset=" ...
- jquery 实现只能选中一个checkbox,选中当前的去除上一个
jq 实现只能选中一个checkbox,选中当前的去除上一个. <div id="checkboxed"> <input name="check1&qu ...
- SQL实用技巧:如何分割字符串
create function f_split(@c varchar(2000),@split varchar(2)) returns @t table(col varchar(20)) as beg ...