身分證字號 有0嗎?

�����Ҧr���W�h

�����Ҧr�����C�Ӧr���N�����N�q�p�U�G A123456789

(1) �Ĥ@�Ӧr���N���a�ϡA�ഫ�覡���G A �ഫ�� 1,0 ��Ӧr���A B �ഫ�� 1,1�K�K

A

B

C

D

E

F

G

H

I

J

K

L

M

N

O

P

Q

R

S

T

U

V

W

X

Y

Z

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

(2) �ĤG�Ӧr���N���ʧO�A 1 �N���k�ʡA 2 �N���k��

(3) �ĤT�Ӧr����ĤE�Ӧr�����y�����X�C

(4) �ĤQ�Ӧr�����ˬd���X�C

�ˬd�X���ͪ��W�h���G

1.

�C�Ӭ۹����Ʀr���W�v��

�ˬd���X

A

1

2

3

4

5

6

7

8

9

1

0

x8

x7

x6

x5

x4

x3

x2

x1

x1

X9

2. �N���W�v�ƫᤧ�n�ۥ[

1 x 1 = 1

0 x 9 = 0

1 x 8 = 8

2 x 7 = 1 4

3 x 6 = 1 8

4 x 5 = 2 0

5 x 4 = 2 0

6 x 3 = 1 8

7 x 2 = 1 4

+) 8 x 1 = 8

------------------------------------------------

1 2 1

3. �ۥ[�ᤧ�Ȱ��H�Ҽ� 10 ����l��

1 2 1 / 1 0 = 12 �E�E�E�l�� 1

4. �ѼҼƴ�h�l�Ʊo�ˬd���X�A�Y�l�Ƭ� 0 �ɡA�h�]�w���ˬd�X�� 0

10 �V 1 = 9

首先我們必須了解台灣身分證的相關格式,舉個例子如A123456789,從這個例子中我們不難發現,身分證一共有10碼,分別是一個代表你的戶籍地址的英文以及9碼數字。然而這9碼數字其中開頭與結尾是有規則性的,讓我們一步步的了解所有的規則吧 !

首先是開頭的英文字母,一共有A~Z共26個英文大寫字母,他們分別代表的意思如下:

A (10)

台北市

G (16)

宜蘭縣

M (21)

南投縣

S (26)

高雄縣

Y (31)

陽明山

B (11)

台中市

H (17)

桃園縣

N (22)

彰化縣

T (27)

屏東縣

Z (33)

連江縣

C (12)

基隆市

I (34)

嘉義市

O (35)

新竹市

U (28)

花蓮縣

D (13)

台南市

J (18)

新竹縣

P (23)

雲林縣

V (29)

台東縣

E  (14)

高雄市

K (19)

苗栗縣

Q (24)

嘉義縣

W (32)

金門縣

F  (15)

台北縣

L (20)

台中縣

R (25)

台南縣

X (30)

澎湖縣

 

For example , A (10) 是台北市,(10) 數字代表的是 A 這個英文字轉換成的數字。

以身分證字號整體規劃如下:

Y x8 x7 x6 x5 x4 x3 x2 x1 Z
A 1 2 3 4 5 6 7 8 9
英文 性別 編號1 編號2 編號3 編號4 編號5 編號6 編號7 檢查碼

我們剛剛已經介紹過英文了,現在來介紹第一碼數字,第一碼數字只有 1 與 2 ,1代表的是男生,2則是女生。至於編號1~7則是戶政事務所給予的配號,當我們在設計程式時編號1~7可以是亂數,不過最後要套入公式計算最後一碼的檢查碼,現在我們來看身分證如何計算:

Y = 個位數字 * 9 + 十位數字/10 
Z = 
10-(Y + x8 * 8 + x7 * 7 + x6 * 6 + x5 * 5 + x4 * 4 + x3 * 3 + x2 * 2 + x1 * 1)%10 

例如:A123456789這個範例 ,
A (10) => 10 / 10  + 0 * 9  = 1
10 - ( 1 + 8 + 14 + 18 +20 + 20 + 18 + 14 + 8) / 10 取餘數(相當於C++中的%) = Z

 ( 1 + 8 + 14 + 18 +20 + 20 + 18 + 14 + 8) = 121
除以10餘1,因此10-1 = 9  ,這個9即是最後一碼的檢查碼。

在舉個更簡單的範例,例如 T12354660X 檢查碼應該是 ?
T(27) => 20 / 10 + 7*9 = 65
10-(65 + 1*8 + 2*7 + 3*6 + 5*5 + 4*4 + 6*3 + 6*2 + 0*1)%10 => 4

因此完整的身分證字號應該是 T123546604

這邊提供一個檢查的公式
X =

Y + x8 * 8 + x7 * 7 + x6 * 6 + x5 * 5 + x4 * 4 + x3 * 3 + x2 * 2 + x1 * 1 + Z
X除以10,必定餘0 。我們在來檢查剛剛的範例吧
(65 + 8 + 14 + 18 + 25 +16 +18 +12 + 0 + 4 )% 10 = 0

網路上也有提供不同的方式,他們是定義成

X1+X2 D1 D2 D3 D4 D5 D6 D7 D8 D9
A 1 2 3 4 5 6 7 8 9
十位數字為X1
個位數字為X2
性別 編號1 編號2 編號3 編號4 編號5 編號6 編號7 檢查碼

Y = X1 + 9*X2 + 8*D1 + 7*D2 + 6*D3 + 5*D4 + 4*D5 + 3*D6 + 2*D7+ 1*D8 + D9
Y除以10,若餘0,則是沒問題的身分證字號。

以上兩種方式只是對於數字的定義不同,沒什麼差異,只是我習慣用上面的方式。


關於身分證:
* 身分證的歷史 : 在民國五十四年才有配給台灣民眾身分證,當時使用的只有9碼,開頭的英文以及八碼的數字,而且到了14歲才能獲的配號;到了民國五十八年新增了檢查碼,也就是上面提到的第九碼,提供基礎的驗證之用;到了民國六十年,初生的嬰兒就能獲得身分證配號,五十四年則是到14歲才能獲得配號,但是能然必須要年滿14歲才能領取身分證。

*有關於英文字母的方面,有人說從此可以看出戶籍地,但是卻不是必然的,因為民國六年年以前的出生者是依照戶籍地而定,然而六十年以後的民眾是依照申報戶口的戶政事務所所在的縣市,來決定英文代號。


程式設計概念:
非常的基礎簡單,只要會亂數,就能夠寫的出來,實在太簡單了,這邊就... 不敘述了。

所需程式技能:
1. 字串或陣列概念(用來儲存身分證字號)
2. 亂數

引導:
1.可以先提供使用者選擇英文代碼,或者亂數產生
2.選定性別 , 或是亂數產生 (可以 rand()%2 + 1的方式來產生)
3.隨機給予亂數7碼
4.計算檢查號
5.輸出