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

紺香零八發表於2020-03-02

演算法提高 身份證號碼升級

問題描述

從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位的字串,作為升級後的身份證號碼
資料規模和約定
  不用判斷輸入的15位字串是否合理
樣例輸入

110105491231002

樣例輸出

11010519491231002x

程式碼如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int num[18] = {7 ,9 ,10 ,5 ,8 ,4 ,2 ,1 ,6 ,3 ,7 ,9 ,10, 5 ,8 ,4 ,2};
	char  a[11] = {'1' ,'0' ,'x' ,'9' ,'8' ,'7' ,'6' ,'5' ,'4' ,'3' ,'2'};
	string str = "";
	string ans = "";
	cin >> str;
	ans = str.substr(0,6)+"19"+str.substr(6);
	int cnt = 0;
	for(int i = 0;i<ans.length();i++){
		cnt += (ans[i]-'0')*num[i];
	}
	ans += a[cnt%11];
	cout << ans;
	return 0;
}

相關文章