这里只是java速成,只限于java语法,包括输入输出,运算处理,字符串和高精度的处理,进制之间的转换等,能解决OJ上的一些高精度题目。

一、样例:java中的输出a+b

import java.io.*;
import java.util.*;
public class Main//注意在oj提交是要用Main
{
public static void main(String[] args)
{
Scanner in=new Scanner (System.in);
while(in.hasNext())
{
int a,b;
a=in.nextInt();
b=in.nextInt();
System.out.println(a+b);
}
}
}

二、具体用法

1. 输入:

格式为:Scanner cin = new Scanner (new BufferedInputStream(System.in));

或者、Scanner cin = new Scanner (System.in);

例:

import java.io.*;
import java.math.*;
import java.util.*;
import java.text.*;
public class Main
{
public static void main(String[] args)
{
Scanner cin = new Scanner (new BufferedInputStream(System.in));
int a;
double b;
BigInteger c;
String st;
a = cin.nextInt();
b = cin.nextDouble();
c = cin.nextBigInteger();
d = cin.nextLine();
// 每种类型都有相应的输入函数.
}
}

2. 输出

函数:System.out.print(); System.out.println(); System.out.printf();

System.out.print(); // cout << …;

System.out.println(); // cout << … << endl;

System.out.printf(); // 与C中的printf用法类似.

  例:

import java.io.*;
import java.math.*;
import java.util.*;
import java.text.*;
public class Main
{
public static void main(String[] args)
{
Scanner cin = new Scanner (new BufferedInputStream(System.in));
int a; double b;
a = ; b = 1.234567;
System.out.println(a + " " + b);
System.out.printf("%d %10.5f\n", a, b);
// 输入b为字宽为10,右对齐,保留小数点后5位,四舍五入.
}
}

规格化的输出:

函数:

// 这里0指一位数字,#指除0以外的数字(如果是0,则不显示),四舍五入.

DecimalFormat fd = new DecimalFormat("#.00#");

DecimalFormat gd = new DecimalFormat("0.000");

System.out.println("x =" + fd.format(x));

System.out.println("x =" + gd.format(x));

3. 字符串处理

  java中字符串String是不可以修改的,要修改只能转换为字符数组.

  例:

import java.io.*;
import java.math.*;
import java.util.*;
import java.text.*;
public class Main
{
public static void main(String[] args)
{
int i;
Scanner cin = new Scanner (new BufferedInputStream(System.in));
String st = "abcdefg";
System.out.println(st.charAt()); // st.charAt(i)就相当于st[i].
char [] ch;
ch = st.toCharArray(); // 字符串转换为字符数组.
for (i = ; i < ch.length; i++)
ch[i] += ;
System.out.println(ch); // 输入为“bcdefgh”.
if (st.startsWith("a")) // 如果字符串以'0'开头.
{
st = st.substring(); // 则从第1位开始copy(开头为第0位).
}
}
}

4. 高精度

BigInteger和BigDecimal可以说是acmer选择java的首要原因。

函数:add, subtract, multiply,divide, mod, compareTo等,其中加减乘除模都要求是BigInteger(BigDecimal)和BigInteger(BigDecimal)之间的运算,所以需要把int(double)类型转换为BigInteger(BigDecimal),用函数BigInteger.valueOf().

例程:

import java.io.*;
import java.math.*;
import java.util.*;
import java.text.*;
public class Main
{
public static void main(String[] args)
{
Scanner cin = new Scanner (new BufferedInputStream(System.in));
int a = 123, b = 456, c = 7890;
BigInteger x, y, z, ans;
x = BigInteger.valueOf(a);
y = BigInteger.valueOf(b);
z = BigInteger.valueOf(c);
ans = x.add(y);
System.out.println(ans);
ans = z.divide(y);
System.out.println(ans);
ans = x.mod(z);
System.out.println(ans);
if (ans.compareTo(x) == 0)
System.out.println("1");
}
}

5. 进制转换

java很强大的一个功能。

函数:

String st = Integer.toString(num, base); // 把num当做10进制的数转成base进制的st(base <= 35).

int num = Integer.parseInt(st, base); // 把st当做base进制,转成10进制的int(parseInt有两个参数,第一个为要转的字符串,第二个为说明是什么进制).

BigInter m = new BigInteger(st, base); // st是字符串,base是st的进制.

//Added by abilitytao

1.如果要将一个大数以2进制形式读入 可以使用cin.nextBigInteger(2);

当然也可以使用其他进制方式读入;

2.如果要将一个大数转换成其他进制形式的字符串 使用cin.toString(2);//将它转换成2进制表示的字符串

  例:POJ 2305

import java.io.*;
import java.util.*;
import java.math.*;
public class Main
{
public static void main(String[] args)
{
int b;
BigInteger p,m,ans;
String str ;
Scanner cin = new Scanner (new BufferedInputStream(System.in));
while(cin.hasNext())
{
b=cin.nextInt();
if(b==0)
break;
p=cin.nextBigInteger(b);
m=cin.nextBigInteger(b);
ans=p.mod(m);
str=ans.toString(b);
System.out.println(str);
}
} }

6. 排序

函数:Arrays.sort();

例:

import java.io.*;

import java.math.*;

import java.util.*;

import java.text.*;

public class Main

{

    public static void main(String[] args) 

    {

        Scanner cin = new Scanner (new BufferedInputStream(System.in));

        int n = cin.nextInt();

        int a[] = new int [n];

        for (int i = 0; i < n; i++) a[i] = cin.nextInt();

        Arrays.sort(a);

        for (int i = 0; i < n; i++) System.out.print(a[i] + " ");

    }

}

7. 结构体排序:一个结构体有两个元素String x,int y,排序,如果x相等y升序,否者x升序。

一、Comparator

强行对某个对象collection进行整体排序的比较函数,可以将Comparator传递给Collections.sort或Arrays.sort。

接口方法:这里也给出了两种方法,

import java.util.*;

class structSort
{
String x;
int y;
} class cmp implements Comparator<structSort>
{ public int compare(structSort o1, structSort o2)
{
if(o1.x.compareTo(o2.x) == 0) //这个相当于c/c++中strcmp(o1.x , o2,x)
{
return o1.y - o2.y;
}
return o1.x.compareTo(o2.x);
} } public class Main
{ public static void main(String[] args)
{
Comparator<structSort> comparator = new Comparator<structSort>()
{
public int compare(structSort o1, structSort o2)
{
if(o1.x.compareTo(o2.x) == 0)
{
return o1.y - o2.y;
}
return o1.x.compareTo(o2.x);
} }; Scanner cin = new Scanner(System.in); int n = cin.nextInt(); structSort a[] = new structSort[10]; for (int i = 0; i < n; i++)
{ a[i] = new structSort(); a[i].x = cin.next(); a[i].y = cin.nextInt(); } Arrays.sort(a,0,n,comparator);//这个直接使用Comparator Arrays.sort(a,0,n,new cmp());//这个实现Comparator,就就跟c++中的sort函数调用就差不多了 for (int i = 0; i < n; i++)
{ System.out.println(a[i].x+" "+a[i].y); } } }
二、Comparable

强行对实现它的每个类的对象进行整体排序,实现此接口的对象列表(和数组)可以通过Collections.sort或Arrays.sort进行自动排序。就是输入完了直接就默认排序了,

接口方法:

import java.util.*;

class structSort implements Comparable<structSort>
{
String x;
int y;
public int compareTo(structSort o1)
{
if(this.x.compareTo(o1.x) == 0)
{
return this.y - o1.y;
}
return this.x.compareTo(o1.x);
} } public class Main
{ public static void main(String[] args)
{ Scanner cin = new Scanner(System.in); int n = cin.nextInt(); structSort a[] = new structSort[10]; for (int i = 0; i < n; i++)
{ a[i] = new structSort(); a[i].x = cin.next(); a[i].y = cin.nextInt(); } Arrays.sort(a,0,n); for (int i = 0; i < n; i++)
{ System.out.println(a[i].x+" "+a[i].y); } } }

三、acm中Java的应用

下面说一下ACM-ICPC队员初用Java编程所遇到的一些问题:

1. 基本输入输出:

(1)

JDK 1.5.0 新增的Scanner类为输入提供了良好的基础,简直就是为ACM-ICPC而设的。

读一个整数:    int n = cin.nextInt();          相当于    scanf("%d", &n);    或 cin >> n;

读一个字符串:String s = cin.next();          相当于    scanf("%s", s);      或 cin >> s;

读一个浮点数:double t = cin.nextDouble();    相当于    scanf("%lf", &t); 或 cin >> t;

读一整行:  String s = cin.nextLine();      相当于   gets(s);          或 cin.getline(...);

判断是否有下一个输入可以用 cin.hasNext() 或 cin.hasNextInt() 或 cin.hasNextDouble()

(2)

输出一般可以直接用 System.out.print() 和 System.out.println(),前者不输出换行,而后者输出。

比如:System.out.println(n);    // n 为 int 型

同一行输出多个整数可以用

System.out.println(new Integer(n).toString() + " " + new Integer(m).toString());

也可重新定义:

static PrintWriter cout = new PrintWriter(new BufferedOutputStream(System.out));

cout.println(n);

(3)

对于输出浮点数保留几位小数的问题,可以使用DecimalFormat类,

import java.text.*;

DecimalFormat f = new DecimalFormat("#.00#");

DecimalFormat g = new DecimalFormat("0.000");

double a = 123.45678, b = 0.12;

System.out.println(f.format(a));

System.out.println(f.format(b));

System.out.println(g.format(b));

  这里0指一位数字,#指除0以外的数字。

2. 大数字

BigInteger 和 BigDecimal 是在java.math包中已有的类,前者表示整数,后者表示浮点数

用法:

不能直接用符号如+、-来使用大数字,例如:

(import java.math.*)    // 需要引入 java.math 包

BigInteger a = BigInteger.valueOf(100);

BigInteger b = BigInteger.valueOf(50);

BigInteger c = a.add(b)    // c = a + b;

主要有以下方法可以使用:

BigInteger add(BigInteger other)

BigInteger subtract(BigInteger other)

BigInteger multiply(BigInteger other)

BigInteger divide(BigInteger other)

BigInteger mod(BigInteger other)

int compareTo(BigInteger other)

static BigInteger valueOf(long x)

输出大数字时直接使用 System.out.println(a) 即可。

3. 字符串

String 类用来存储字符串,可以用charAt方法来取出其中某一字节,计数从0开始:

String a = "Hello";      // a.charAt(1) = ’e’

用substring方法可得到子串,如上例

System.out.println(a.substring(0, 4))      // output "Hell"

注意第2个参数位置上的字符不包括进来。这样做使得 s.substring(a, b) 总是有 b-a个字符。

字符串连接可以直接用 + 号,如

String a = "Hello";

String b = "world";

System.out.println(a + ", " + b + "!");      // output "Hello, world!"

如想直接将字符串中的某字节改变,可以使用另外的StringBuffer类。

4. 调用递归(或其他动态方法)

在主类中 main 方法必须是 public static void 的,在 main 中调用非static类时会有警告信息,可以先建立对象,然后通过对象调用方法:

public class Main
{
... void dfs(int a)
{
if (...) return;
...
dfs(a+1);
} public static void main(String args[])
{
...
Main e = new Main();
e.dfs(0);
...
} }

5.Java进制转换

由于Unicode兼容ASCII(0~255),因此,上面得到的Unicode就是ASCII。

java中进行二进制,八进制,十六进制,十进制间进行相互转换

Integer.toHexString(int i)

十进制转成十六进制

Integer.toOctalString(int i)

十进制转成八进制

Integer.toBinaryString(int i)

十进制转成二进制

Integer.valueOf("FFFF",16).toString()

十六进制转成十进制

Integer.valueOf("876",8).toString()

八进制转成十进制

Integer.valueOf("0101",2).toString()

二进制转十进制

以字符a的ASCII为例:

int i = 'a';

String iBin = Integer.toBinaryString(i);//二进制

String iHex = Integer.toHexString(i);//十六进制

String iOct = Integer.toOctalString(i);//八进制

String iWoKao = Integer.toString(i,3);//三进制或任何你想要的35进制以下的进制

JAVA中关于大数问题的更多相关文章

  1. Java中的大数处理类BigInteger和BigDecimar浅析

    这两个类位于java.math包内,要使用它们必须在类前面引用该包:import java.math.BigInteger;和import java.math.BigDecimal; BigInteg ...

  2. java中的大数BigInteger

    compareTo比较大小 equals比较是否相等 ,不能用== while(cin.hasNext())//等价于!=EOF n=cin.nextBigInteger();//读入一个大整数 Sy ...

  3. Java中大数的使用与Java入门(NCPC-Intergalactic Bidding)

    引入 前几天参加湖南多校的比赛,其中有这样一道题,需要使用高精度,同时需要排序,如果用c++实现的话,重载运算符很麻烦,于是直接学习了一发怎样用Java写大数,同时也算是学习Java基本常识了 题目 ...

  4. java中大数类的学习

    java中提供了大数类BigInteger和BigDecimal分别表示大整数类和大浮点数类,这两个类都在java.math.*包中,因此每次必须在开头处引用该包. 一.BigInteger构造函数: ...

  5. java求两个数中的大数

    java求两个数中的大数 java中的max函数在Math中 应用如下: int a=34: int b=45: int ans=Math.max(34,45); 那么ans的值就是45.

  6. java 中的小数点、大数、随机数处理

    1.小数点处理 public class Test { public static void main(String[] args) { double i = 3.856; // 舍掉小数取整 Sys ...

  7. 算法竞赛中的常用JAVA API :大数类(转载)

    5.算法竞赛中的常用JAVA API :大数类 摘要 java中的基础数据类型能存储的最大的二进制数是 2 ^ 63 - 1 对应的十进制数是9223372036854775807(long类型的最大 ...

  8. Java中的经典算法之冒泡排序(Bubble Sort)

    Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...

  9. Java中不同的并发实现的性能比较

    Fork/Join框架在不同配置下的表现如何? 正如即将上映的星球大战那样,Java 8的并行流也是毁誉参半.并行流(Parallel Stream)的语法糖就像预告片里的新型光剑一样令人兴奋不已.现 ...

随机推荐

  1. dotnet core 实践——日志组件Serilog

     前几天把基于quartz.net的部分项目代码移植到了dotnet core ,但是没增加日志功能,原因是没找到合适的组件. 今天终于找到了Serilog: https://github.com/s ...

  2. CURL 简介【转载】

    转自http://hancang2010.blog.163.com/blog/static/1824602612010711104018261/ 0) 头信息 curl命令查询服务器头信息 curl ...

  3. iOS7下滑动返回与ScrollView共存二三事

    [转载请注明出处] = =不是整篇复制就算注明出处了亲... iOS7下滑动返回与ScrollView共存二三事 [前情回顾] 去年的时候,写了这篇帖子iOS7滑动返回.文中提到,对于多页面结构的应用 ...

  4. jquery-load()方法

    调用load方法的完整格式是:load( url, [data], [callback] ), 其中: •url:是指要导入文件的地址. •data:可选参数:因为Load不仅仅可以导入静态的html ...

  5. ES6基础知识汇总

    1.如何理解ECMAScript6? ECMAScript是什么,ECMASCript的作用 2.新增let关键字 let的用途 3.关键字const const作用,传址赋值 4.解构赋值 解构赋值 ...

  6. 解决 IE7 中 display:inline-block 失效的问题

    我们在做首页菜单选项的时候,通常会用 li 标签去做,通过对 li 标签设置样式: display:inline-block 可以让 li 标签横排显示.但是这样做,在 IE7 浏览器下面会有一个兼容 ...

  7. cookie知识点概述

    cookie是什么 这个讲起来很简单,了解http的同学,肯定知道,http是一个不保存状态的协议,什么叫不保存状态,就是一个服务器是不清楚是不是同一个浏览器在访问他,在cookie之前,有另外的技术 ...

  8. Python作业工资管理系统(第三周)

    作业内容: 实现效果: 从info.txt文件中读取员工及其工资信息,最后将修改或增加的员工工资信息也写入原info.txt文件. 效果演示: 1. 查询员工工资 2. 修改员工工资 3. 增加新员工 ...

  9. PHP 结合实例认识 Socket

    一.简介 (本部分参考自 揭开Socket的神秘面纱 - 源码工作室) 请结合下图 Socket 抽象层的位置来理解.Socket 是应用层和 TCP/IP 协议族进行通信的中间软件抽象层,是一组接口 ...

  10. Repository.UpdateModel(model, db);

    Repository.UpdateModel(model, db); 可用类型 string int? datetime 不可用类型 int double