您的位置:首页 > 编程语言 > Java开发

java学习小记 输入输出 字符串 函数 高精度 进制转换

2014-02-01 20:26 525 查看
经过一场新年练习赛之后终于下定决心学习java了,毕竟c++的大数模板有较大的局限性,java这方面就是作弊器一般的存在……

个人觉得在有c/c++语言基础的情况下学习别的语言是比较轻松的,不过时间不多,也只能速成了,遇到新问题再慢慢学。

以下算是学习笔记,有很多个人的理解,因为是速成的关系,可能有些错误,还望大家指正。

学习链接:

J***A ACM 基础 - 话别深秋 - 博客频道 - CSDN.NET

【学习笔记】ACM与Java - 脑残的孩子只有慢慢学。。 - 博客频道 - CSDN.NET

java在ACM中的应用(转载)_依然_新浪博客

DecimalFormat的用法 Java小数(float、dobule)格式化_!I am a Programmer !_课后小组

Java函数的基本知识 - SereinChan - 博客频道 - CSDN.NET

Java做ACM-ICPC的特点:

(1) 在一般比赛中,Java程序会有额外的时间和空间,而实际上经过实验,在执行计算密集任务的时候Java并不比C/C++慢多少,只是IO操作较慢而已。

(2) Java 简单而功能强大,有些东西用Java实现起来更为方便,比如高精度。

比如 Poj 2429 用java和用c++简直两个难度……

(3) 用Java不易犯细微的错误,比如C/C++中的指针, “if (n = m) ... ” 等

(4) 目前来看Eclipse已成基本配置,写Java程序反而比C/C++更方便调试。在具体竞赛时也算多一种选择。

(5) 学会Java对以后工作有好处。现在国外很多地方会Java的人比会C/C++的人多。

软件的配置

我用的IDE是eclipse 4.3.1

(1) 网上说的很多的“取消自动validation”我没找到……

(2) 设置工作空间的项目编码, 防止出现乱码

Window - Preferences - General - Workspace将"Text file encoding"选为"Other" - "UTF-8"

改变现有项目的编码的步骤: 右击项目属性, 选择"Text file encoding"的编码

(3) 增强Eclipse的自动代码提示功能

1. Window -> Preferences -> Java -> Editor -> Content Assist

2. 将"Auto Activation triggers for java"设置为".abc"(默认是"."), 点"Apply"应用

3. 导出目前的Eclipse配置文件: File -> Export -> General -> Perferences, 选择保存路径, 保存得到*.epf文件

4. 用文本编辑器打开刚才保存的*.epf文件, 搜索".abc", 将".abc"部分改为

".abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ(," (以上为自动提示的触发字符,根据个人习惯设置), 保存此配置文件(个人觉得不太好用,容易出错)

5. 导入此配置文件: File -> import -> General -> Perferences, 导入修改后的配置文件.

(4) 关闭不需要的启动项MyEclipse:

Windows –> Perferences–> General–> Startup and Shutdown

(5) 改变字号及字体

右键 - Perferences - General - Appearance - Colors and Fonts

基本的输入输出

输入

读一个整数: 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(...);



读一个大数: BigInteger c = cin.nextBigInteger();

不过需要注意的是它们没有像scanf一样有判断是否输入到结尾的功能。

这时候需要用一个Scanner类的方法hasnext()来判断是否输入到文件结尾;
以 Hdu 1000 A + B Problem 为例

import java.util.*; //我们需要其中的 Scanner类声明的对象来扫描控制台输入

public class Main
{
	public static void main (String [] args)
	{
		Scanner cin = new Scanner(System.in); //对于Scanner 类声明对象cin用来扫描控制台输入 
		while ( cin.hasNext() )   //判断是否文件结束
		{
			int a=cin.nextInt();
			int b=cin.nextInt();
			System.out.println(a+b);
		}
		cin.close(); //输入关闭
	}
}


基本输出

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

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

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

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


public class Main
{
	public static void main (String [] args)
	{
		double d=9999.99999;  
   
		System.out.format("%f",d);                //9999.999990     没有回车  
          
		System.out.format("%10.10f",d).println(); //9999.9999900000 输出回车  
          
		System.out.format("%.4f",d).println();    //10000.0000      输出回车  
          
		System.out.format("%3.4f",d).println();   //10000.0000      输出回车  
          
		System.out.println(d);                    //输出当前变量      输出回车  
          
		System.out.println();                     //                输出回车  
          
		System.out.printf("%f",d);                //9999.999990     没有回车  
          
		System.out.print(d);                      //9999.99999      没有回车
	}
}


浮点数的规格化输出

import java.text.*;   //使用规格化输出需要这个

public class Main
{
    public static void main(String[] args)
    {
    	DecimalFormat df = new DecimalFormat();
    	double data = 1234.56789;
    	System.out.println("格式化之前的数字: " + data);
    	String style = "0.0";//定义要显示的数字的格式
    	df.applyPattern(style);// 将格式应用于格式化器
    	System.out.println("采用style: " + style + "格式化之后: " + df.format(data));
    	style = "00000.000 kg";//在格式后添加诸如单位等字符
    	df.applyPattern(style);
    	System.out.println("采用style: " + style + "格式化之后: " + df.format(data));
    	// 模式中的"#"表示如果该位存在字符,则显示字符,如果不存在,则不显示。
    	style = "##000.000 kg";
    	df.applyPattern(style);
    	System.out.println("采用style: " + style + "格式化之后: " + df.format(data));
    	// 模式中的"-"表示输出为负数,要放在最前面
    	style = "-000.000";
    	df.applyPattern(style);
    	System.out.println("采用style: " + style + "格式化之后: " + df.format(data));
    	// 模式中的","在数字中添加逗号,方便读数字
    	style = "-0,000.0#";
    	df.applyPattern(style);
    	System.out.println("采用style: " + style + "格式化之后: " + df.format(data));
    	// 模式中的"E"表示输出为指数,"E"之前的字符串是底数的格式,
    	// "E"之后的是字符串是指数的格式
    	style = "0.00E000";
    	df.applyPattern(style);
    	System.out.println("采用style: " + style + "格式化之后: " + df.format(data));
    	// 模式中的"%"表示乘以100并显示为百分数,要放在最后。
    	style = "0.00%";
    	df.applyPattern(style);
    	System.out.println("采用style: " + style + "格式化之后: " + df.format(data));
    	// 模式中的"\u2030"表示乘以1000并显示为千分数,要放在最后。
    	style = "0.00\u2030";
    	//在构造函数中设置数字格式
    	DecimalFormat df1 = new DecimalFormat(style);
    	//df.applyPattern(style);
    	System.out.println("采用style: " + style + "格式化之后: " + df1.format(data));
    }
}


输出结果:

格式化之前的数字: 1234.56789

采用style: 0.0格式化之后: 1234.6

采用style: 00000.000 kg格式化之后: 01234.568 kg

采用style: ##000.000 kg格式化之后: 1234.568 kg

采用style: -000.000格式化之后: -1234.568

采用style: -0,000.0#格式化之后: -1,234.57

采用style: 0.00E000格式化之后: 1.23E003

采用style: 0.00%格式化之后: 123456.79%

采用style: 0.00‰格式化之后: 1234567.89‰

字符串

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!"

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

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


函数

和c++基本一样……只是函数需要加修饰符 static
另外,Java 是面向对象的语言,里面的函数统称为方法。
在主类中 main 方法必须是 public static void 的,在 main 中调用非static类时会有警告信息,可以先建立对象,然后通过对象调用方法:

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

高精度

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

对于大数来说,Java提供了BigDecimal和BigInteger两个类,都包含在java.math.*里面。

BigInteger是大整型类,BigDecimal是大浮点型类。

这两个类产生的对象没有数据范围,只要你的电脑内存足够就可以。

用法:

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

(import 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) 即可。

import java.math.BigInteger;

public class Main
{
	public static void main(String[] args)
	{
		int a=6,b=3;
		BigInteger x,y,z;
		x=BigInteger.valueOf(a); 		   //转化赋值
		y=BigInteger.valueOf(b);
		z=BigInteger.valueOf(0);
		System.out.println(x.add(y));      //加
		System.out.println(x.subtract(y)); //减
		System.out.println(x.multiply(y)); //乘
		System.out.println(x.divide(y));   //除
		System.out.println(x.mod(y));      //取余
		if (z.compareTo( BigInteger.valueOf(0) ) == 0) //相等返回0
            System.out.println("1");
	}
}


进制转换

public class Main
{
	public static void main (String[] args)
	{
		String string;
		int a=8,x=2;
		string = Integer.toString(a, x);    //把int型数据转换乘X进制数并转换成string型
		System.out.println(string);
		
		int b = Integer.parseInt(string, x);//把字符串当作X进制数转换成int型
		System.out.println(b);
	}
}

写在最后

貌似java的数组十分复杂,需要继续学习,详细情况应该会在下一篇博文中记录。
这里先摘抄一段:

import java.io.*;
import java.util.*;

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 
;
        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] + " ");
    }
}


POJ高精度题目汇总:

POJ 1131 1205 1220 1405 1503 1604 1894 2084 2305 2325 2389 2413 3101 3199

注意:java中布尔类型为 boolean,只有true和false二值,在 if (...) / while (...) 等语句的条件中必须为boolean类型。
在C/C++中的 if (n % 2) ... 在Java中无法编译通过。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: