大数-加减乘除模
打2017icpc沈阳站的时候遇到了大数的运算,发现java与c++比起来真的很赖皮,竟然还有大数运算的函数,为了以后打比赛更快的写出大数的算法并且保证不错,特意在此写一篇博客,
记录java的大数运算,也算是ACM java写法的入门:
学习博客:https://www.cnblogs.com/wkfvawl/p/9377441.html
进入到eclipse界面
第一步:file->new->java project->起名->finish
第二步:进入到刚才建的工程里,右键src->new->package->起名->finish
第三步:进入到刚才建的package里,右键name->new->class->起名(这里起名要注意,因为比赛时如果交java代码,这里的类名就要命名为Main,区分大小写)
1.Java的输入与输出
Java的输入是先定义一个scanner,然后用这个进行输入,并且每一种输入都有相应的输入函数,具体如下:
Scanner cin =new Scanner(System.in); int a; double b; BigInteger c; String d; a=cin.nextInt(); b=cin.nextDouble(); c=cin.nextBigInteger(); d=cin.next(); //每种类型都有相应的函数输入 System.out.println(a); System.out.println(b); System.out.println(c); System.out.println(d);
下面给几个入门代码:
输出Hello World
package ACM代码; import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String args[]) { System.out.println("Hello World!"); } }
计算a+b
package ACM代码; import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String args[]) { Scanner cin=new Scanner(System.in); int a,b; a=cin.nextInt(); b=cin.nextInt(); System.out.println(a+b); } }
多组输入输出
package ACM代码; import java.math.BigInteger; import java.util.Scanner; 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(); System.out.println(a+b); } } }
2、下面是重头戏了,大数处理!
下面就开始说大数的相关操作
首先我们需要导包,即BigIntegr类 和 BigDecimal类所在的包
import java,math.*;
*就代表导入包math里面所有的类,如果你不喜欢看到 *
那么你也可以写 import java,math.BigInteger; import java,math.BigDecimal;
1.大整数的加减乘除求余等计算:
/* * 大数的加减运算不同于普通函数的加减乘除运算 * 加----a+b:a=a.add(b) * 减----a-b:a=a.subtract(b) * 乘----a*b:a=a.multiply(b) * 除----a/b:a=a.divide(b) * 求余--a%b:a=a.mod(b) * 转换--a=b:b=BigInteger.valueOf(a) * 比较--if(ans.compareTo(x)==0) System.out.println("相等") * System.out.println("a + b = "+ans_add); // 这里的‘+’ (第二个) 是连接的意思 */ package ACM代码; import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String args[]) { Scanner cin=new Scanner(System.in); BigInteger a,b,x,y; BigInteger ans_add,ans_sub,ans_mul,ans_div,ans_mod; a=cin.nextBigInteger(); b=cin.nextBigInteger(); ans_add=a.add(b); ans_sub=a.subtract(b); ans_mul=a.multiply(b); ans_div=a.divide(b); ans_mod=a.mod(b); x=BigInteger.valueOf(1);//转化 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); System.out.println("x="+x); if(a.compareTo(b)==0) //比较是否相等 System.out.println("相等"); else System.out.println("不相等"); } }
3、下面来几道题目练练手:
UVA—10106:a*b
题目链接:https://vjudge.net/problem/UVA-10106
看代码:
import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String args[]) { Scanner cin=new Scanner(System.in); BigInteger a,b; while(cin.hasNext()) { a=cin.nextBigInteger(); b=cin.nextBigInteger(); System.out.println(a.multiply(b)); } } }
UVA—424:多个数连续相加,遇到0就停止相加,给出结果
题目链接:https://vjudge.net/problem/UVA-424
看代码:
import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String args[]) { Scanner cin=new Scanner(System.in); BigInteger y=BigInteger.valueOf(0); BigInteger ans=BigInteger.valueOf(0); BigInteger x; while(cin.hasNext()) { x=cin.nextBigInteger(); if(x.compareTo(y)==0) break; ans=ans.add(x); // System.out.println(x); // System.out.println(ans); } System.out.println(ans); } }
HDU - 1042:计算阶乘:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1042
看代码:
import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String args[]) { Scanner cin=new Scanner(System.in); int n; while(cin.hasNext()) { n=cin.nextInt(); BigInteger ans=BigInteger.valueOf(1); for(int i=1;i<=n;i++) { ans=ans.multiply(BigInteger.valueOf(i)); } System.out.println(ans); } } }
UVA —10494
求两个大数相除或者求余
题目链接:https://vjudge.net/problem/UVA-10494
代码:
import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String args[]) { Scanner cin = new Scanner(System.in); BigInteger n,m; String s; while(cin.hasNext()) { n=cin.nextBigInteger(); s=cin.next(); m=cin.nextBigInteger(); if(s.equals("%")) System.out.println(n.mod(m)); else System.out.println(n.divide(m)); } } }
POJ1001 计算a^b 注意是小数
题目链接:http://poj.org/problem?id=1001
import java.math.BigDecimal; import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String args[]) { Scanner cin = new Scanner(System.in); while(cin.hasNext()) { BigDecimal R=cin.nextBigDecimal(); int n=cin.nextInt(); R=R.pow(n); String ans=R.stripTrailingZeros().toPlainString();//去掉后面没用的0 if(ans.charAt(0)=='0') ans=ans.substring(1);//返回以第一个字符开始的串 System.out.println(ans); } } }
关于BigDecimal的用法大致上和BigInteger一样。
不过这里需要提一下,在进行大浮点数运算的时候,小数点后面可能会含有多余的后导0
比如0.5000,在题目要求中可能只需要输出0.5
当然,有的题目可能还会要求小数点前面的0也要去掉,输入.5
这时候我们就需要去除掉后导0
转化成 字符型的
方法如下:
String ans=R.stripTrailingZeros().toPlainString();//去掉后面没用的0 if(ans.charAt(0)=='0') ans=ans.substring(1);//返回以第一个字符开始的串
import java.math.BigInteger; import java.util.*; public class Main { public static void main(String[] args) { Scanner s = new Scanner(System.in); BigInteger a, b, t = new BigInteger("1"); String c; while (s.hasNext()) { a = s.nextBigInteger(); c = s.next(); b = s.nextBigInteger(); if (c.equals("%"))///equals用来比较的是两个对象的内容是否相等 t = a.mod(b); if (c.equals("/")) t = a.divide(b); System.out.println(t); } } }
POJ1001 计算a^b 注意是小数
1 import java.util.*; 2 import java.math.*; 3 4 public class Main { 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 Scanner input = new Scanner(System.in); 8 while (input.hasNext()) { 9 BigDecimal a = input.nextBigDecimal(); // 大数类的double; 10 int b = input.nextInt(); 11 a = a.pow(b); 12 String ans = a.stripTrailingZeros().toPlainString(); // 去掉尾部零,转换成非科学计数法字符串 13 if (ans.charAt(0) == '0') { // 如果以0开头 14 ans = ans.substring(1); // 返回以位置1开头的该字符串 15 } 16 System.out.println(ans); 17 } 18 } 19 }
关于BigDecimal的用法大致上和BigInteger一样。
不过这里需要提一下,在进行大浮点数运算的时候,小数点后面可能会含有多余的后导0
比如0.5000,在题目要求中可能只需要输出0.5
当然,有的题目可能还会要求小数点前面的0也要去掉,输入.5
这时候我们就需要去除掉后导0
转化成 字符型的
方法如下:
1 String str; 2 str=ans.stripTrailingZeros().toPlainString();//去除所有后导0,并且转化成字符型 3 //ans为大浮点数运算后得到的答案 4 //如果小数点前面的0也需要去掉,那么输出的时候处理一下即可: 5 if(str.charAt(0)=='0')//如果以0开头 6 System.out.println(str.substring(1));//返回以位置1开头的字符串 7 else 8 System.out.println(str);
HDU—1023:计算卡特兰数
1 //卡特兰数递推公式h(n)=h(n-1)*(4*n-2)/(n+1); 2 import java.math.*; 3 import java.util.*; 4 public class Main { 5 public static void main(String[] args) { 6 Scanner cin = new Scanner(System.in); 7 BigInteger dp[];//定义一个数组 8 dp=new BigInteger[110];//规定数组的大小 9 dp[1]=BigInteger.valueOf(1); 10 int i,m; 11 for(i=2;i<=100;i++)//卡特兰数打表 12 { 13 dp[i]=dp[i-1].multiply(BigInteger.valueOf(4*i-2)).divide(BigInteger.valueOf(i+1)); 14 } 15 while(cin.hasNext()) 16 { 17 m=cin.nextInt(); 18 System.out.println(dp[m]); 19 } 20 } 21 }