2016年6月11日 星期六

zj-a020身分證及y044s是否被11整除

Zja020:身分證檢查碼
假設所輸入的身分證字串s長度及格式{1碼大寫字母、第212、其它皆數字}皆正確,
只要檢查最後一碼即可,所以
(1) 將第1個字母轉成1個兩位數LL的十位數*1L的個位數*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 索引的奇數位和及偶數位和為oddeven
表頭及宣告就省略了,以下為迴圈計算奇數位的和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 意見:

張貼留言