java处理大数_Java大数处理

Java在大数的处理上比C确实流氓多了,在这里我整理一些有关Java的一些基础知识和模板,以便之后学习。

内容大多摘自两位师哥,这里给出原文的链接

进入到eclipse界面

第一步:file->new->java project->起名->finish

第二步:进入到刚才建的工程里,右键src->new->package->起名->finish

第三步:进入到刚才建的package里,右键name->new->class->起名(这里起名要注意,因为比赛时如果交java代码,这里的类名就要命名为Main,区分大小写)

1.Java的输入与输出

Java的输入是先定义一个scanner,然后用这个进行输入,并且每一种输入都有相应的输入函数,具体如下:

1 public classMain2 {3 public static voidmain(String[] args)4 {5 Scanner cin = newScanner ( System.in);6 inta;7 doubleb;8 BigInteger c;9 String d;10 a =cin.nextInt();11 b =cin.nextDouble();12 c =cin.nextBigInteger();13 d =cin.nextLine();14 //每种类型都有相应的输入函数.

15 }16 }

Java的输出

1 System.out.println(a + " " + b);//换行2 System.out.printf("%d %10.5f\n", a, b);3

4 /*规格化的输出:5 函数:这里0指一位数字,#指除0以外的数字(如果是0,则不显示),四舍五入.*/

6 DecimalFormat fd = new DecimalFormat("#.00#");7 DecimalFormat gd = new DecimalFormat("0.000");8 System.out.println("x =" +fd.format(x));9 System.out.println("x =" + gd.format(x));

这里给出几个简单代码

1.输出hellow world

1 packageBigInteger;2 public classMain {3 public static voidmain(String args[]) {4 System.out.println("Hello world");5 }6 }

关于上面的package BigInteger,提交代码时不需要粘贴。

2.计算a+b

1 packageBigInteger;2 import java.util.*;//导包,相当于c/c++里的头文件

3 public classMain {4 public static voidmain(String args[]) {5 Scanner cin = newScanner(System.in);6 inta,b;7 a =cin.nextInt();8 b=cin.nextInt();9 int ans = a +b;10 System.out.println(ans);11 }12 }

3.多组输入输出

1 packageBigInteger;2 import java.util.*;3 public classMain {4 public static voidmain(String args[]) {5 Scanner cin = newScanner(System.in);6 inta, b;7 while(cin.hasNext()) {8 a =cin.nextInt();9 b =cin.nextInt();10 int ans = a +b;11 System.out.println(ans);12 }13 }14 }

2.Java大数处理

下面就开始说大数的相关操作

首先我们需要导包,即BigIntegr类 和 BigDecimal类所在的包

import java,math.*;

*就代表导入包math里面所有的类,如果你不喜欢看到 *

那么你也可以写 import java,math.BigInteger; import java,math.BigDecimal;

1.大整数的加减乘除求余等计算

1 /*

2 大数的加减运算不同于普通整数的加减乘除运算3 加—— a+b: a=a.add(b);4 减—— a-b: a=a.subtract(b);5 乘—— a*b: a=a.multiply(b);6 除—— a/b: a=a.divide(b);7 求余—a%b: a=a.mod(b);8 转换—a=b: b=BigInteger.valueOf(a);9 比较 if (ans.compareTo(x) == 0)//比较10 System.out.println("相等");11 System.out.println("a + b = "+ans_add); // 这里的‘+’ (第二个) 是连接的意思12 */

13 packagewkf;14 import java.util.*;15 import java.math.*;16 public classMain {17 public static voidmain(String args[]) {18 Scanner cin = newScanner(System.in);19 BigInteger a,b,x,y;20 BigInteger ans_add,ans_sub,ans_mul,ans_div,ans_mod;21 a=cin.nextBigInteger();22 b=cin.nextBigInteger();23 ans_add = a.add(b); //a+b

24 ans_sub = a.subtract(b); //a-b

25 ans_mul = a.multiply(b); //a*b

26 ans_div = a.divide(b); //a/b

27 ans_mod = a.mod(b); //a%b

28 x=BigInteger.valueOf(1);//转换

29 System.out.println("a + b = "+ans_add);30 System.out.println("a - b = "+ans_sub);31 System.out.println("a * b = "+ans_mul);32 System.out.println("a / b = "+ans_div);33 System.out.println("a % b = " +ans_mod);34 System.out.println(x);35 if (a.compareTo(b) == 0)//比较

36 System.out.println("相等");37 else

38 System.out.println("不相等");39 }40 }

3.例题

UVA—10106:a*b

1 importjava.math.BigInteger;2 import java.util.*;3 public classMain {4 public static voidmain(String args[]) {5 Scanner s = newScanner(System.in);6 while(s.hasNext()) {7 BigInteger a=s.nextBigInteger();8 BigInteger b=s.nextBigInteger();9 BigInteger ans=a.multiply(b);10 System.out.println(ans);11 }12 }13 }

UVA—424:多个数连续相加,遇到0就停止相加,给出结果

1 import java.math.*;2 importjava.util.Scanner;3 import java.io.*;4 public classMain {5 public static voidmain(String args[]){6 BigInteger ans = BigInteger.valueOf(0);7 BigInteger x;8 BigInteger y = BigInteger.valueOf(0);9 Scanner cin = newScanner(System.in);10 while(cin.hasNext()){11 x =cin.nextBigInteger();12 if(x.equals(y)) ///加到0就要停止相加

13 break;14 ans =ans.add(x);15 }16 System.out.println(ans);17 }18 }

HDU - 1042:计算阶乘:

1 packagewkf;2 import java.io.*;3 importjava.math.BigInteger;4 import java.util.*;5 public class Main//注意在oj提交是要用Main

6 {7 public static voidmain(String[] args) {8 Scanner in = newScanner(System.in);9 intn;10 while(in.hasNext()) {11 n =in.nextInt();12 BigInteger sum = BigInteger.valueOf(1);13 for (int i = 1; i <= n; i++)14 sum =sum.multiply(BigInteger.valueOf(i));15 System.out.println(sum);16 }17 }18 }

UVA —10494

求两个大数相除或者求余

importjava.math.BigInteger;import java.util.*;public classMain {public static voidmain(String[] args) {

Scanner s= newScanner(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 classMain {5 public static voidmain(String[] args) {6 //TODO Auto-generated method stub

7 Scanner input = newScanner(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 classMain {5 public static voidmain(String[] args) {6 Scanner cin = newScanner(System.in);7 BigInteger dp[];//定义一个数组

8 dp=new BigInteger[110];//规定数组的大小

9 dp[1]=BigInteger.valueOf(1);10 inti,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 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值