三.常用数据类型及输入输出
java语言在许多方面与C++非常类似,虽然是完全面向对象语言,但是为了使用方便它依然保留了C/C++中的基本数据类型(当然对于这些基本数据类型也有面向对象的实现)
boolean : 布尔值,仅有两个值,true和false.
byte :字节类型值,长度8位(一个字节),范围-128至127。
short:短整型值,长度16位(两个字节),范围-32768至32767。
int:整型值,长度32位(四个字节),范围-2147483648至2147483647
long:长整型,长度64位(八个字节),范围-9223372036854775808至9223372036854775807
float:单精度浮点数,长度32位(四个字节)。
double:双精度浮点数,长度64位(八个字节)。
char:字符型,长度16位,支持所有的UCS-2和ASCII编码。
除了以上的8种基本数据类型,对于ACMer还有BigInteger,BigDecimal,String三个类经常使用.
输入:
java是完全面向对象语言,所以对于输入会有专门的一个Scanner类的对象来负责输入.
先声明一个Scanner对象,代码如下:
Scanner cin = new Scanner(System.in);
类名 对象名 构造函数 参数
关于Scanner类更详细的使用,可以到按附录中的网址去查询Java的API
Scanner类提供了非常丰富的成员函数来负责读取各种数据类型:
返回值 成员函数
String next(String pattern)
如果下一个标记与从指定字符串构造的模式匹配,则返回下一个标记,
如果参数为空,就是读取一个字符串
BigDecimal nextBigDecimal()
将输入信息的下一个标记扫描为一个 BigDecimal。
BigInteger nextBigInteger()
将输入信息的下一个标记扫描为一个 BigInteger。
boolean nextBoolean()
扫描解释为一个布尔值的输入标记并返回该值。
byte nextByte()
将输入信息的下一个标记扫描为一个 byte。
double nextDouble()
将输入信息的下一个标记扫描为一个 double。
float nextFloat()
将输入信息的下一个标记扫描为一个 float。
int nextInt()
将输入信息的下一个标记扫描为一个 int。
String nextLine()
此扫描器执行当前行,并返回跳过的输入信息。
long nextLong()
将输入信息的下一个标记扫描为一个 long。
short nextShort()
将输入信息的下一个标记扫描为一个 short。
输出:
在java中负责输出的函数有:
System.out.print(); // cout << …;
System.out.println(); //与C++的cout << … <<endl;
System.out.printf(); // 与C中的printf用法类似.
为了方便起见,一下贴出BigInteger,BigDecimal和String类最常用的成员函数:
Bignteger
返回值 成员函数
BigInteger add(BigInteger val)
返回其值为 (this + val) 的 BigInteger。
BigInteger subtract(BigInteger val)
返回其值为 (this - val) 的 BigInteger。
BigInteger multiply(BigInteger val)
返回其值为 (this * val) 的 BigInteger。
BigInteger divide(BigInteger val)
返回其值为 (this / val) 的 BigInteger。
BigInteger mod(BigInteger m)
返回其值为 (this mod m) 的 BigInteger。
int compareTo(BigInteger val)
将此 BigInteger 与指定的 BigInteger 进行比较。
如果和val相等返回0,小于返回-1,大于返回1
BigInteger pow(int exponent)
返回其值为 (this exponent) 的 BigInteger。
String toString()
返回此 BigInteger 的十进制字符串表示形式。
String toString(int radix)
返回此 BigInteger 的给定基数的字符串表示形式。
static BigInteger valueOf(long val)
返回其值等于指定 long 的值的 BigInteger。
BigInteger gcd(BigInteger val)
返回一个 BigInteger,其值是 abs(this) 和 abs(val) 的最大公约数。
BigInteger abs()
返回其值是此 BigInteger 的绝对值的 BigInteger。
int hashCode()
返回此 BigInteger 的哈希码。
boolean isProbablePrime(int certainty)
如果此 BigInteger 可能为素数,则返回 true,如果它一定为合数,则返回 false。
BigInteger nextProbablePrime()
返回大于此 BigInteger 的可能为素数的第一个整数。
int signum()
返回此 BigInteger 的正负号函数。
除了以上成员函数,BigInteger还有几个非常常用的属性
BigInteger.ZERO BigInteger 的常量 0。
BigInteger.ONE BigInteger 的常量 1。
BigInteger.TEN BigInteger 的常量 10。
BigDecimal
返回值 成员函数
BigDecimal add(BigDecimal augend)
返回一个 BigDecimal,其值为 (this + augend)。
BigDecimal subtract(BigDecimal subtrahend)
返回一个 BigDecimal,其值为 (this - subtrahend)。
BigDecimal multiply(BigDecimal multiplicand)
返回一个 BigDecimal,其值为 (this × multiplicand).
BigDecimal divide(BigDecimal divisor)
返回一个 BigDecimal,其值为 (this / divisor).
BigDecimal pow(int n)
返回其值为 (thisn) 的 BigDecimal,准确计算该幂,使其具有无限精度。
int compareTo(BigDecimal val)
将此 BigDecimal 与指定的 BigDecimal 比较。
static BigDecimal valueOf(double val)
使用 Double.toString(double) 方法提供的 double 规范的字符串
表示形式将 double 转换为 BigDecimal。
BigDecimal stripTrailingZeros()
返回数值上等于此小数,但从该表示形式移除所有尾部零的 BigDecimal。
String toPlainString()
返回不带指数字段的此 BigDecimal 的字符串表示形式。
String toString()
返回此 BigDecimal 的字符串表示形式,如果需要指数,则使用科学记数法。
BigDecimal abs()
返回 BigDecimal,其值为此 BigDecimal 的绝对值,其标度为 this.scale()。
int hashCode()
返回此 BigDecimal 的哈希码。
int signum()
返回此 BigDecimal 的正负号函数。
BigInteger的三个重要属性,BigDecimal同样也有,这里就不再复述了.
String
返回值 成员函数
char charAt(int index)
返回指定索引处的 char 值。
String substring(int beginIndex)
返回一个新的字符串,它是此字符串的一个子字符串。
String substring(int beginIndex, int endIndex)
返回一个新字符串,它是此字符串的一个子字符串。
int length()
返回此字符串的长度。
String toLowerCase()
使用默认语言环境的规则将此 String 中的所有字符都转换为小写。
String toUpperCase()
使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
int compareTo(String anotherString)
按字典顺序比较两个字符串。
String concat(String str)
将指定字符串联到此字符串的结尾。
boolean contains(CharSequence s)
当且仅当此字符串包含 char 值的指定序列时,才返回 true。
int hashCode()
返回此字符串的哈希码。
boolean startsWith(String prefix)
测试此字符串是否以指定的前缀开始。
boolean endsWith(String suffix)
测试此字符串是否以指定的后缀结束。
String trim()
返回字符串的副本,忽略前导空白和尾部空白。
这里指的java速成,只限于java语法,包括输入输出,运算处理,字符串和高精度的处理,进制之间的转换等,能解决OJ上的一些高精度题目。
1. 输入:
格式为:Scannercin = new Scanner (new BufferedInputStream(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 (newBufferedInputStream(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 (newBufferedInputStream(System.in));
int a; double b;
a = 12345; 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 (newBufferedInputStream(System.in));
String st = "abcdefg";
System.out.println(st.charAt(0)); //st.charAt(i)就相当于st.
char [] ch;
ch = st.toCharArray(); // 字符串转换为字符数组.
for (i = 0; i < ch.length; i++)ch += 1;
System.out.println(ch); // 输入为“bcdefgh”.
if (st.startsWith("a")) // 如果字符串以'0'开头.
{
st =st.substring(1); // 则从第1位开始copy(开头为第0位).
}
}
}
4. 高精度
BigInteger和BigDecimal可以说是acmer选择java的首要原因。
函数:add, subtract,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 (newBufferedInputStream(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.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);
}
}
}
//End by abilitytao
6. 排序
函数:Arrays.sort();至于怎么排序结构体,像C++里写个cmp的方法,在java还不太清楚,希望有人指点下~~
例程:
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 (newBufferedInputStream(System.in));
int n = cin.nextInt();
int a[] = new int [n];
for (int i = 0; i < n; i++) a =cin.nextInt();
Arrays.sort(a);
for (int i = 0; i < n; i++)System.out.print(a + " ");
}
}
------------------------------------------------------------------------------------------------------------------------------------
Chapter I. |