藍橋杯_演算法提高_身份證升級(簡單字元處理)

huangxiang360729發表於2016-04-01

問題描述
  從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.Scanner;

/**
 * @author 翔
 *
 */
public class Main {
    private static int[] arr={7 ,9 ,10 ,5 ,8 ,4 ,2 ,1 ,6 ,3 ,7 ,9 ,10 ,5 ,8 ,4 ,2};
    private static char[] p={'1' ,'0' ,'x' ,'9' ,'8' ,'7' ,'6' ,'5' ,'4' ,'3' ,'2'};

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc=new Scanner(System.in);
        String s=sc.next();
        s=s.substring(0,6)+"19"+s.substring(6);
        char[] charArr=s.toCharArray();
        int[] numArr=new int[17];
        for(int i=0;i<17;i++){
            numArr[i]=charArr[i]-'0';
        }
        int sum=0;
        for(int i=0;i<17;i++){
            sum+=(numArr[i]*arr[i]);
        }
        int remain=sum%11;
        s+=p[remain];
        System.out.println(s);
    }

}

相關文章