2016藍橋杯演算法提高——身份證號碼升級

勇者-李曉凱發表於2016-02-21
身份證號碼升級
問題描述
  從1999年10月1日開始,公民身份證號碼由15位數字增至18位。(18位身份證號碼簡介)。升級方法為:
  1、把15位身份證號碼中的年份由2位(7,8位)改為四位。
  2、最後新增一位驗證碼。驗證碼的計算方案:
  將前 17 位分別乘以對應係數 (7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2) 並相加,然後除以 11 取餘數,0-10 分別對應 1 0 x 9 8 7 6 5 4 3 2。
  請編寫一個程式,使用者輸入15位身份證號碼,程式生成18位身份證號碼。假設所有要升級的身份證的四位年份都是19××年
輸入格式
  一個15位的數字串,作為身份證號碼
輸出格式
  一個18位的字串,作為升級後的身份證號碼
樣例輸入
110105491231002
樣例輸出
11010519491231002x
資料規模和約定
  不用判斷輸入的15位字串是否合理

程式碼:
import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) throws Exception {
		char[] c1={'1','0','x','9','8','7','6','5','4','3','2'};
		int[] c2={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
		String s=new String();
		Scanner in = new Scanner(System.in);
		s=in.next();
		char[] ch=s.toCharArray();
		char[] c=new char[20];
		System.arraycopy(ch, 0, c, 0, ch.length); //擴充套件陣列的長度,因為直接轉換為陣列,在下面的for語句中陣列會越界
		for(int i=14;i>=6;i--){
			c[i+2]=c[i];
		}
		c[6]='1';
		c[7]='9';
		int sum=0;
		for(int i=0;i<=16;i++){
			sum+=(int)(c[i]-'0')*c2[i];
		}
		sum%=11;
		for(int i=0;i<17;i++)
		System.out.print(c[i]);
		System.out.println(c1[sum]);
	}
}


相關文章