OJ2002
import java.util.Scanner;
import javax.sql.rowset.CachedRowSet;
public class Main2002{
private static Scanner in;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
final double PI = 3.1415927;
while(in.hasNext()) {
double R = in.nextDouble();
double area = PI*R*R*R*(double)4/(double)3;
System.out.println(String.format("%.3f", area));
}
}
}
import javax.sql.rowset.CachedRowSet;
public class Main2002{
private static Scanner in;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
final double PI = 3.1415927;
while(in.hasNext()) {
double R = in.nextDouble();
double area = PI*R*R*R*(double)4/(double)3;
System.out.println(String.format("%.3f", area));
}
}
}
调试两次成功,第一次因为直接使用的 Math.PI 调取的圆周率,所以显示Time Limit,最后使用final解决问题(因为库函数中的圆周率太大)
OJ2003
import java.util.Scanner;
import javax.sql.rowset.CachedRowSet;
public class Main2003{
private static Scanner in;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(in.hasNext()) {
double A = in.nextDouble();
double B = Math.abs(A);
System.out.println((String.format("%.2f", B)));
}
}
}
import javax.sql.rowset.CachedRowSet;
public class Main2003{
private static Scanner in;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(in.hasNext()) {
double A = in.nextDouble();
double B = Math.abs(A);
System.out.println((String.format("%.2f", B)));
}
}
}
新知识点:Math.abs()为取绝对值;
System.out.println((String.format("%.2f".B))); 输出对B保留两位小数
OJ2004
mport java.util.Scanner;
import javax.sql.rowset.CachedRowSet;
public class Main2004{
private static Scanner in;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(in.hasNext()) {
int scor = in.nextInt();
if(scor<0||scor>100)
{
System.out.println("Score is error!");
}
else if (scor>=90&&scor<=100)
{
System.out.println("A");
}
else if(scor>=80)
{
System.out.println("B");
}
else if(scor>=70)
{
System.out.println("C");
}
else if(scor>=60)
{
System.out.println("D");
}
else if(scor<60&&scor>=0)
{
System.out.println("E");
}
}
}
}
import javax.sql.rowset.CachedRowSet;
public class Main2004{
private static Scanner in;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(in.hasNext()) {
int scor = in.nextInt();
if(scor<0||scor>100)
{
System.out.println("Score is error!");
}
else if (scor>=90&&scor<=100)
{
System.out.println("A");
}
else if(scor>=80)
{
System.out.println("B");
}
else if(scor>=70)
{
System.out.println("C");
}
else if(scor>=60)
{
System.out.println("D");
}
else if(scor<60&&scor>=0)
{
System.out.println("E");
}
}
}
}
OJ2005
import java.util.Scanner;
public class Main2005{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
int date[] = {31,28,31,30,31,30,31,31,30,31,30,31};
int month = 0;
int day;
String string =in.next();
String time[] = string.split("/");
int []times = new int[time.length];
for(int i=0;i<time.length;i++)
{
times[i]=Integer.parseInt(time[i]);
}
if ((times[0]%4==0&×[0]%100!=0)||times[0]%400==0)
{
date[1] = 29;
}
for(int j = 0;j<times[1]-1;j++)
{
month = month+date[j];
}
day = month + times[2];
System.out.println(day);
}
}
}
public class Main2005{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
int date[] = {31,28,31,30,31,30,31,31,30,31,30,31};
int month = 0;
int day;
String string =in.next();
String time[] = string.split("/");
int []times = new int[time.length];
for(int i=0;i<time.length;i++)
{
times[i]=Integer.parseInt(time[i]);
}
if ((times[0]%4==0&×[0]%100!=0)||times[0]%400==0)
{
date[1] = 29;
}
for(int j = 0;j<times[1]-1;j++)
{
month = month+date[j];
}
day = month + times[2];
System.out.println(day);
}
}
}
新知识点:
1. times[i] = integer.parseInt(time[i]);
(以下转自他人博客)
(1)int n = Integer.parseInt(args[0]) 表示给定义的变量n 赋予一个初值为"Integer.parseInt(args[0])";
(2)Integer.parseInt(args[0])中,Integer是java中的一个内置类,parseInt()是这个类的一个静态方法,这个方法的作用是把括号里面的参数(args[0])转为int型的值,比如定义一个String a="123",这时"a"是一个字符串,不能进行数值计算,如果你要让"a"能进行数值计算,你就可以用Integer.parseInt(a)这个函数把"a"转为int型再来进行数值计算。
2. String time[] = string.split("/");
我们常常用String的split()方法去分割字符串,有两个地方值得注意:
1. 当分隔符是句号时("."),需要转义:
由于String.split是基于正则表达式来分割字符串,而句号在正则表达式里表示任意字符。
//Wrong: //String[] words = tmp.split("."); //Correct: String[] words = tmp.split("\\.");
所以,假设分隔符在正则表达式里有一定的意义时,需要格外留心,必须将它们转义才能达到分割的效果。
2. 假设字符串最后有连续多个分隔符,且这些分隔符都需要被分割的话,需要调用split(String regex,int limit)这个方法:
String abc = "a,b,c,,,"; String[] str = abc.split(","); System.out.println(Arrays.toString(str)+" "+str.length); String[] str2 = abc.split(",",-1); System.out.println(Arrays.toString(str2)+" "+str2.length);输出如下:
[a, b, c] 3
[a, b, c, , , ] 6
需要输出csv文件的时候,尤其需要注意。
3. 假设需要快速分割字符串,split()并不是最有效的方法。在split()方法内,有如下的实现:
1 public String[] split(String regex, int limit) { 2 return Pattern.compile(regex).split(this, limit); 3 }
频繁调用split()会不断创建Pattern这个对象,因此可以这样去实现,减少Pattern的创建:
1 //create the Pattern object outside the loop 2 Pattern pattern = Pattern.compile(" "); 3 4 for (int i = 0; i < 1000000; i++) 5 { 6 String[] split = pattern.split("Hello World", 0); 7 list.add(split); 8 }
另外split()也往往比indexOf()+subString()这个组合分割字符串要稍慢,详情可看这个帖子。
我在本机做过测试,感觉indexOf()+subString()比split()快一倍:
1 public static void main(String[] args) { 2 StringBuilder sb = new StringBuilder(); 3 for (int i = 100000; i < 100000 + 60; i++) 4 sb.append(i).append(' '); 5 String sample = sb.toString(); 6 7 int runs = 100000; 8 for (int i = 0; i < 5; i++) { 9 { 10 long start = System.nanoTime(); 11 for (int r = 0; r < runs; r++) { 12 StringTokenizer st = new StringTokenizer(sample); 13 List<String> list = new ArrayList<String>(); 14 while (st.hasMoreTokens()) 15 list.add(st.nextToken()); 16 } 17 long time = System.nanoTime() - start; 18 System.out.printf("StringTokenizer took an average of %.1f us%n", time / runs 19 / 1000.0); 20 } 21 { 22 long start = System.nanoTime(); 23 Pattern spacePattern = Pattern.compile(" "); 24 for (int r = 0; r < runs; r++) { 25 List<String> list = Arrays.asList(spacePattern.split(sample, 0)); 26 } 27 long time = System.nanoTime() - start; 28 System.out.printf("Pattern.split took an average of %.1f us%n", time / runs 29 / 1000.0); 30 } 31 { 32 long start = System.nanoTime(); 33 for (int r = 0; r < runs; r++) { 34 List<String> list = new ArrayList<String>(); 35 int pos = 0, end; 36 while ((end = sample.indexOf(' ', pos)) >= 0) { 37 list.add(sample.substring(pos, end)); 38 pos = end + 1; 39 } 40 } 41 long time = System.nanoTime() - start; 42 System.out 43 .printf("indexOf loop took an average of %.1f us%n", time / runs / 1000.0); 44 } 45 } 46 }