今日题目:POJ1001、POJ1002
(一)POJ1001
1.首先考虑内置类型是否能用,显然不能用。发现内置double类型最多能保证小数点后15位精度,第16位将会有问题。
2.上网查找到与BigInteger类型类似的BigDecimal类型。该类可保存任意精度的实数,并可表示成指数形式、非指数形式。
3.主要出现的问题是忽略了题干中的“结尾不能出现零”。受内置double类型的影响,忽略了BigDecimal的运算不会将末位的0丢弃。调用其内置的stripTrailingZeros函数完美解决此问题。
源代码如下:
import java.math.BigDecimal; import java.util.Scanner; //POJ 1001 /*Date: 2016.07.15 * 1st: Wrong Answer * 2nd: Wrong Answer * 3rd: Wrong Answer * 4th: Accepted */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { BigDecimal t = sc.nextBigDecimal(); int ti = sc.nextInt(); String ts = t.pow(ti).toPlainString(); if (ts.charAt(0) == '0' && ts.charAt(1) == '.') ts = ts.substring(1); System.out.println(ts); } } }
(二)POJ1002
1.思路较为简单,就是读入字符串,将字符串的每个字符逐一操作、转换。然后进行排序、查重。2.主要问题是在读入字符串的时候,如果采用sc.next()则最后一个输入被抛弃,提示用户再读入一个字符串,当输入一个新字符串后,那个被抛弃的字符串被“找回”。若采用sc.nextLine(),则第一个输入读入的是换行符。3. 上述问题浪费较多的时间(包括上一题也是)。后来发现是在复制示例输入数据的时候,由于最后一行没有换行符,导致输入时就会出现输入格式问题。不过在此期间,却弄懂了next,nextLine的区别,并对相关输入流有了更清晰的认识。弄懂了所谓分隔符的意义、用法。源代码如下:import java.util.Arrays; import java.util.Scanner; //POJ 1002 /*Date: 2016.07.15 * 1st: Wrong Answer missing "No duplicates." * 2nd: Wrong Answer missing Hyphens * 3rd: Wrong Answer One less output * 4th: Accepted */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); String []sa = new String[n]; for(int i = 0; i < n; i++){ StringBuilder ts = new StringBuilder(sc.next()); //to phone number StringBuilder ss = new StringBuilder(); for(int j = 0; j < ts.length(); j++){ char ch = ts.charAt(j); if(ch == '-') continue; int ti = ch - 'A'; //it's a number if(ti < 0) ss.append(ch); else if(ti <= 2){ ss.append(2); } else if(ti <= 5){ ss.append(3); } else if(ti <= 8){ ss.append(4); } else if(ti <= 11){ ss.append(5); } else if(ti <= 14){ ss.append(6); } else if(ti <= 18){ ss.append(7); } else if(ti <= 21){ ss.append(8); } else if(ti <= 24){ ss.append(9); } } //to sort the arrays (String array can use Arrays.sort, but StringBuilder cannot) sa[i] = ss.toString(); } Arrays.sort(sa); boolean flag = false; for(int i = 0; i < n; i++){ int times = 1; for(int j = i + 1; j < n; j++){ if(!sa[j].equals(sa[i])) break; times++; i++; } if(times != 1){ System.out.println(sa[i].substring(0, 3) + "-" + sa[i].substring(3, 7) + " " + times); flag = true; } } if(!flag){ System.out.println("No duplicates. "); } } }