题目来源:PAT 乙级真题——1031 查验身份z (15 分)
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static boolean isRight(int n, char c) { //判断校验码的有效性 char[] m = {'1','0','X','9','8','7','6','5','4','3','2'}; // 校验码 if(m[n] == c) { return true; } return false; } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.valueOf(br.readLine()); int[] arr = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; // 权重数组 char[] m = {'1','0','X','9','8','7','6','5','4','3','2'}; // 校验码 int count = 0 ; // 记录有效身份z号码的个数 for(int i = 0 ; i < n ; i++) { int sum = 0; // 记录权重和 int mod = 0; // 记录对11取模之后的数字 boolean flag = true; // 记录身份证的有效性 String str = br.readLine(); String sFront = str.substring(0,str.length()-1); // 截取前17位 char sLast = str.substring(str.length()-1,str.length()).charAt(0); // 截取最后一位 for(int j = 0 ; j < sFront.length() ; j++) { // 计算权重和并判断是否为数字 int num = (int)sFront.charAt(j); // 转换为ASCII码表表示的十进制,0~9为48~57 if(num <48 || num > 57) { // 判断前17位是否全为数字 flag = false; break; } int number = sFront.charAt(j) - '0'; sum += number * arr[j]; } if(flag) { mod = sum % 11; if(isRight(mod,sLast)) { count ++; } else { System.out.println(str); } } else { System.out.println(str); } } if(count == n) { System.out.println("All passed"); } } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)