打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 }
 
 
分类: Java
 
好文要顶 关注我 收藏该文  
0
0
 
 
 
posted @ 2018-07-27 14:36 王陸 阅读(2931) 评论(0) 编辑 收藏
 
 

ACM java写法入门的更多相关文章

  1. 《Java从入门到精通》src0-8

    public class HelloWorld { public static void main(String[] args) { System.out.println("Hello wo ...

  2. Java并发入门之FutureTask

    Java并发入门之FutureTask 前言: 最近遇到一个项目需要上传图片到服务器,API要求是二进制流,那就跑慢点一点点上传. 于是对多线程从没有应用过的我,决定拿多线程直接应用于代码. 应用Ex ...

  3. Java程序入门

    编写Java源程序 在d:\day01 目录下新建文本文件,完整的文件名修改为HelloWorld.java ,其中文件名为HelloWorld ,后缀名必须为.java . 用记事本打开 在文件中键 ...

  4. Java GUI入门手册-AWT篇

    Java GUI入门手册: AWT是基本的GUI设计工具,重点学习其中的布局格式以及事件监听事件. 首先创建一个窗口,我们先分析Frame类中的方法: 通过上图,可以看出frame是由构造方法的重载: ...

  5. 自学 Java 怎么入门

    自学 Java 怎么入门? 595赞同反对,不会显示你的姓名     给你推荐一个写得非常用心的Java基础教程:java-basic | 天码营 这个教程将Java的入门基础知识贯穿在一个实例中,逐 ...

  6. 《JAVA 从入门到精通》 - 正式走向JAVA项目开发的路

    以前很多时候会开玩笑,说什么,三天学会PHP,七天精通Nodejs,xx天学会xx ... 一般来说,这样子说的多半都带有一点讽刺的意味,我也基本上从不相信什么快速入门.我以前在学校的时候自觉过很多门 ...

  7. Java NIO入门(二):缓冲区内部细节

    Java NIO 入门(二)缓冲区内部细节 概述 本文将介绍 NIO 中两个重要的缓冲区组件:状态变量和访问方法 (accessor). 状态变量是前一文中提到的"内部统计机制"的 ...

  8. 完成《Java编程入门》初稿

    Java编程入门 现在的运维工程师不但要懂得集合网络.系统管理而且要和开发人员一起调试系统,社会上也需要"复合性"的运维人员,所以需要做运维的也要懂一些开发,知道软件系统接口的调试 ...

  9. 三、Android NDK编程预备之Java jni入门创建C/C++共享库

    转自: http://www.eoeandroid.com/thread-264971-1-1.html 应网友回复,答应在两天前要出一篇创建C/C++共享库的,但由于清明节假期,跟朋友出去游玩,丢手 ...

随机推荐

  1. 编写高质量代码改善C#程序的157个建议——建议62:避免嵌套异常

    建议62:避免嵌套异常 应该允许异常在调用堆栈上往上传,不要过多的使用catch,然后再throw.过多的使用catch会带来两个问题: 1)代码更多了.这看上去好像你根本不知道怎么处理异常,所以你总 ...

  2. Appium常用Api实操

    本文是基于python语言在android上实操的,仅记录(忽略排版~~~) 会不时更新的: from appium import webdriver from selenium.webdriver. ...

  3. C#:几种数据库的大数据批量插入 - faib

    在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解 ...

  4. HBASE学习d端口master:16010(java操作hbase)https://www.cnblogs.com/junrong624/p/7323483.html

    HBase提示已创建表,但是list查询时,却显示表不存在. https://blog.csdn.net/liu16659/article/details/80216085 下载网址 http://a ...

  5. [改善] dcef3 for Firemonkey 浏览器控件,拉动窗体大小会闪烁的问题

    问题:dcef3 for Firemonkey 浏览器控件,拉动窗体大小会闪烁的问题 修改源码:ceffmx.pas 找到 procedure TCustomChromiumFMX.Resize; 修 ...

  6. Linq基础操作之Select,Where,OrderBy,ThenBy源码分析

    Linq基础操作之Select,Where,OrderBy,ThenBy源码分析 二:Select 它是延迟执行.yield有得一拼,因为他们都是生成了一个枚举类. if (source is TSo ...

  7. C# Email 发送邮件,对方打开通知你

    直接上代码: //回执地址 var Receipt = "填写你需要回执的地址"; //实例化两个必要的 MailMessage mail = new MailMessage(); ...

  8. leetcode 48. 旋转图像 java

    class Solution { public void rotate(int[][] matrix) { int n = matrix.length; for (int k = 0; k < ...

  9. 2个list取差集

    list操作 element in a list but not in other list,元素在一个list,不在另一个list 在数据量大的时候使用numpy的setdiff1d方法的性能非常好 ...

  10. “全栈2019”Java第四十五章:super关键字

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...