題目:java
一個合法的身份證號碼由17位地區、日期編號和順序編號加1位校驗碼組成。校驗碼的計算規則以下:spa
首先對前17位數字加權求和,權重分配爲:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};而後將計算的和對11取模獲得值Z
;最後按照如下關係對應Z
值與校驗碼M
的值:code
Z:0 1 2 3 4 5 6 7 8 9 10 M:1 0 X 9 8 7 6 5 4 3 2
輸入格式:blog
輸入第一行給出正整數N(≤100)是輸入的身份證號碼的個數。隨後N行,每行給出1個18位身份證號碼。io
輸出格式:class
按照輸入的順序每行輸出1個有問題的身份證號碼。這裏並不檢驗前17位是否合理,只檢查前17位是否全爲數字且最後1位校驗碼計算準確。若是全部號碼都正常,則輸出All passed。import
輸入樣例1:sed
4 320124198808240056 12010X198901011234 110108196711301866 37070419881216001X
輸出樣例1:im
12010X198901011234 110108196711301866 37070419881216001X
輸入樣例2:static
2 320124198808240056 110108196711301862
輸出樣例2:
All passed
問題分析:
1.身份證號碼由17位數字和一位校驗碼組成,所以要判斷輸入的身份證號碼中的的前17位是否均爲數字。
2.對前十七位加權求和,而且將結果模11取餘。
java實現:
import java.io.BufferedReader; import java.io.InputStreamReader; class Main { public static int[] weight = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; public static int[] Z = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; public static String[] M = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"}; public static boolean isValid(String id) { int w = 0; for (int i = 0; i < 17; i++) { if((id.charAt(i)-'0') >=0 && (id.charAt(i)-'0')<=9){ w = w + (id.charAt(i) - '0') * weight[i]; } else return false; } int z = w % 11; if (M[Z[z]].compareToIgnoreCase(id.charAt(17) + "") == 0) return true; return false; } public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); boolean flag = true; for (int i = 0; i < n; i++) { String id = br.readLine(); if (isValid(id)) { } else { flag = false; System.out.println(id); } } if (flag) System.out.println("All passed"); } }
提交結果: