Java 实现大数算法
转自大佬博客 https://blog.csdn.net/Akatsuki__Itachi/article/details/81152232
在ACM竞赛里难免会遇到一些大数(即超大数字!)的问题,但是对于ACMers来说,彼时还没有学过java,只会敲一手C/C++(比如我的大一),这篇博客就简单讲一下用java来实现大数的相关操作
关于eclipse的使用,这里也捎带一提。
配置了jdk并安装好eclipse之后(什么?怎么配置jdk?当然要点这里了!(ubuntu系统))
进入到eclipse界面
第一步:file->new->java project->起名->finish
第二步:进入到刚才建的工程里,右键src->new->package->起名->finish
第三步:进入到刚才建的package里,右键name->new->class->起名(这里起名要注意,因为比赛时如果交java代码,这里的类名就要命名为Main,区分大小写)
下面就开始写我们的代码了
先从最简单的来说:
1.输出hello world
package BigInteger;
public class Main {
public static void main(String args[]) {
System.out.println("Hello world");
}
}
关于上面的package BigInteger,提交代码时不需要粘贴。
2.计算a+b
package BigInteger;
import java.util.*;//导包,相当于c/c++里的头文件
public class Main {
public static void main(String args[]) {
Scanner cin = new Scanner(System.in);
int a,b;
a = cin.nextInt();
b=cin.nextInt();
int ans = a + b;
System.out.println(ans);
}
}
3.多组输入 a b
package BigInteger;
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner cin = new Scanner(System.in);
int a,b;
while(cin.hasNext()) {
a=cin.nextInt();
b=cin.nextInt();
int ans=a+b;
System.out.println(ans);
}
}
}
下面就开始说大数的相关操作
首先我们需要导包,即BigIntegr类 和 BigDecimal类所在的包
import java,math.*;
*就代表导入包math里面所有的类,如果你不喜欢看到 *
那么你也可以写 import java,math.BigInteger; import java,math.BigDecimal;
1.大整数的加减乘除求余计算
package BigInteger;
import java.util.*;
import java.math.*;
public class Main {
public static void main(String args[]) {
Scanner cin = new Scanner(System.in);
BigInteger a , b;
a=cin.nextBigInteger();
b=cin.nextBigInteger();
BigInteger ans_add,ans_sub,ans_mul,ans_div,ans_mod;
ans_add = a.add(b); //a+b
ans_sub = a.subtract(b); //a-b
ans_mul = a.multiply(b); //a*b
ans_div = a.divide(b); //a/b
ans_mod = a.mod(b); //a%b
System.out.println("a + b = "+ans_add);
System.out.println("a - b = "+ans_sub);
System.out.println("a * b = "+ans_mul);
System.out.println("a / b = "+ans_div);
System.out.println("a % b = "+ans_mod);
}
}
运行结果如下:
下面举个求阶乘的例子:
package BigInteger;
import java.util.*;
import java.math.*;
public class Main {
public static BigInteger factorial(BigInteger n){
BigInteger bd1 = new BigInteger("1");
BigInteger bd2 = new BigInteger("2");
BigInteger result = bd1;
while(n.compareTo(bd1) > 0){
result = result.multiply(n);
n = n.subtract(bd1);
}
return result;
}
public static void main(String args[]) {
Scanner cin = new Scanner(System.in);
BigInteger n;
n=cin.nextBigInteger();
BigInteger ans;
ans = factorial(n);
System.out.println("n的阶乘为: "+ans);
}
}
关于BigDecimal的用法大致上和BigInteger一样。
不过这里需要提一下,在进行大浮点数运算的时候,小数点后面可能会含有多余的后导0
比如0.5000,在题目要求中可能只需要输出0.5
当然,有的题目可能还会要求小数点前面的0也要去掉,输入.5
这时候我们就需要去除掉后导0
转化成 字符型的
方法如下:
String str;
str=ans.stripTrailingZeros().toPlainString();//去除所有后导0,并且转化成字符型
//ans为大浮点数运算后得到的答案
//如果小数点前面的0也需要去掉,那么输出的时候处理一下即可:
if(str.charAt(0)=='0')
System.out.println(str.substring(1));
else
System.out.println(str);
具体题目见这里!