ACM java写法入门
打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 }

ACM java写法入门的更多相关文章
- 《Java从入门到精通》src0-8
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello wo ...
- Java并发入门之FutureTask
Java并发入门之FutureTask 前言: 最近遇到一个项目需要上传图片到服务器,API要求是二进制流,那就跑慢点一点点上传. 于是对多线程从没有应用过的我,决定拿多线程直接应用于代码. 应用Ex ...
- Java程序入门
编写Java源程序 在d:\day01 目录下新建文本文件,完整的文件名修改为HelloWorld.java ,其中文件名为HelloWorld ,后缀名必须为.java . 用记事本打开 在文件中键 ...
- Java GUI入门手册-AWT篇
Java GUI入门手册: AWT是基本的GUI设计工具,重点学习其中的布局格式以及事件监听事件. 首先创建一个窗口,我们先分析Frame类中的方法: 通过上图,可以看出frame是由构造方法的重载: ...
- 自学 Java 怎么入门
自学 Java 怎么入门? 595赞同反对,不会显示你的姓名 给你推荐一个写得非常用心的Java基础教程:java-basic | 天码营 这个教程将Java的入门基础知识贯穿在一个实例中,逐 ...
- 《JAVA 从入门到精通》 - 正式走向JAVA项目开发的路
以前很多时候会开玩笑,说什么,三天学会PHP,七天精通Nodejs,xx天学会xx ... 一般来说,这样子说的多半都带有一点讽刺的意味,我也基本上从不相信什么快速入门.我以前在学校的时候自觉过很多门 ...
- Java NIO入门(二):缓冲区内部细节
Java NIO 入门(二)缓冲区内部细节 概述 本文将介绍 NIO 中两个重要的缓冲区组件:状态变量和访问方法 (accessor). 状态变量是前一文中提到的"内部统计机制"的 ...
- 完成《Java编程入门》初稿
Java编程入门 现在的运维工程师不但要懂得集合网络.系统管理而且要和开发人员一起调试系统,社会上也需要"复合性"的运维人员,所以需要做运维的也要懂一些开发,知道软件系统接口的调试 ...
- 三、Android NDK编程预备之Java jni入门创建C/C++共享库
转自: http://www.eoeandroid.com/thread-264971-1-1.html 应网友回复,答应在两天前要出一篇创建C/C++共享库的,但由于清明节假期,跟朋友出去游玩,丢手 ...
随机推荐
- C++11之Lambda特性探析
目录 目录 1 1. 什么是Lambda? 1 2. 语法格式 1 2.1. 语法格式 1 2.2. 最简定义 2 3. 应用示例 2 4. capture列表 3 4.1. 基本形式 3 4.2. ...
- HALCON机器视觉软件
HALCON是德国MVtec公司开发的一套完善的标准的机器视觉算法包,拥有应用广泛的机器视觉集成开发环境.它节约了产品成本,缩短了软件开发周期——HALCON灵活的架构便于机器视觉,医学图像和图像分析 ...
- 手机SLAM开发
...惯性定位 由简入繁 保留JPG文件. 回环 建模
- winsock的io模型(终极篇)
最近在看服务器框架的搭建,看了不少,都是零零碎碎的,觉得看的差不多了,可以写点最后的总结了,然后,竟然发现了这篇文章,总结做的特别好,肯定比我总结写要好多了,所以我也就不写了,直接转吧...... 套 ...
- Memcache+Cookie替代Session解决方案(MVC版)
阅读目录 开始 通过IHttpModule注册过滤管道方式 通过BaseController 关于滑动过期 两种方式 回到顶部 通过IHttpModule注册过滤管道方式 具体实现如下: 声明一个类C ...
- Javascript与数据结构系列(一)——栈的实现
栈的实现 实现一个栈,当务之急是决定存储数据的底层数据结构.这里采用的是数组. 我们的实现以定义 Stack 类的构造函数开始: function Stack() { this.dataStore = ...
- opencv——播放视频
#include "stdafx.h" #include <opencv2\opencv.hpp> #include <iostream> #include ...
- JulyNovel-React
写在前面的话 目前,JulyNovel后端框架基本搭建.部署完毕,GraphQL提供的API接口也有着高可用性,数据库里也存了六七百兆爬来的小说数据,是时候开始写前端了. 框架选用 JulyNovel ...
- docker 进入容器
- S:List
描述 写一个程序完成以下命令:new id ——新建一个指定编号为id的序列(id<10000)add id num——向编号为id的序列加入整数nummerge id1 id2——合并序列id ...
