Zj之a020:身分證檢查碼
假設所輸入的身分證字串s長度及格式{第1碼大寫字母、第2碼1或2、其它皆數字}皆正確,
只要檢查最後一碼即可,所以
(1) 將第1個字母轉成1個兩位數L,L的十位數*1、L的個位數*9
(2) 將第2個字元~第9個字元分別乘上8 ~ 1 {並全部加總}
(3) 加上第10碼的和 ,如被10整除為real,否則fake
(4) 字串中的第1碼索引由0開始所以是 pid[0] ~ 第10碼 pid[9],
又字串中的字元A其內碼值為65需減 ‘A’或65才是數值、 又字元0內碼為48
以下程式碼,省略表頭,且一次只輸入一筆身分證字串 {不必像zj需多筆}
//宣告一個陣列 seq對照每個英文字母所轉換的兩位數L {索引0:A=10、…、索引25:Z=33}
int
seq[]={10,11,12,13,14,15,16,17,34,18,19,20,21,22,35,23,24,25,26,27,28,29,32,30,31,33};
宣告一個字串pid代表身份證: string pid;
輸入一個字串pid代表身份證: cin>>pid
;
將第1個字母轉成1個兩位數L: int L=seq[int(pid[0]-'A')]; // 字母轉成 兩位數 L
十位乘1 + 個位*9加入和sum : int sum=L/10+(L%10)*9;
//將第2個字元~第9個字元分別乘上8 ~ 1 {並全部加總}
迴圈的索引為1~8 : for(int i=1;i<=8;i++) // 2~9碼:索引 1~8
迴圈內的每一碼乘上加權加入和: sum+=( (pid[i]-'0')*(9-i) ) ; // 第2~9碼 乘8~1
第10碼加上和: sum+=(pid[9]-'0');
不被10整除就不正確印fack : if(sum%10!=0) cout<<"fake"<<endl;
整除就正確印real : else
cout<<"real"<<endl;
y044s:
11的倍數?
因y044s上課時已講解過,以下解說較精簡
字串 n ,長度為n.size() ,索引i: 0~n.size()-1 索引的奇數位和及偶數位和為odd及even
表頭及宣告就省略了,以下為迴圈計算奇數位的和odd及偶數位的和even
迴圈對n的每一位數: for( i=0; i<n.size(); ++i) {以下兩行}
若i為偶數even+該位數: if(i%2==0)even+=( n[i]-48 );
若i為奇數odd +該位數: else odd+=( n[i]-48 );
// 若 (奇數位的和-偶數位的和) 取絕對值是 11的倍數則整個 n 就是11 倍數
差為0也是11的倍數: if(odd==even) cout
<< "YES" << endl;
不相等算出差,再判斷: else { 有4行 }
宣告變數 d 差 = 奇-偶 : int d=odd-even;
但可能為負數, 改為正數: if( odd<even ) d = -d;
被11整除印出YES: if( d % 11 ==0 ) cout
<< "YES" << endl;
不被11整除印出NO: else cout <<
"NO" << endl;
0 意見:
張貼留言