マイナンバーのチェックディジットを計算するプログラム(C言語)
最近話題の12桁の個人番号(いわゆるマイナンバー)は住民票コードを変換して作られた11桁の数字と、1桁のチェックディジットからなるそうです。チェックディジットは省令で次のように定義されています。
第五条 令第八条の総務省令で定める算式は、次に掲げる算式とする。
算式 11-(Σ[n=1, 11]Pn×Qnを11で除した余り) ただし、Σ[n=1, 11]Pn×Qnを11で除した余り≦1の場合は0とする。
算式の符号 Pn 個人番号を構成する検査用数字以外の十一桁の番号の最下位の桁を1桁目としたときのn桁目の数字 Qn 1≦n≦6 のときn+1 7≦n≦11のときn-5
丁寧に記述されていますね。せっかくなので定義文そのままなCプログラムにしました。
#include <stdio.h> #include <string.h> /* 個人番号の上11桁からチェックディジットを計算する */ int IndividualNumberCD(const int* p) { int n, q, sigma, mod, cd; sigma = 0; for (n = 1; n <= 11; n++) { q = (n <= 6) ? n + 1 : n - 5; sigma += p[n-1] * q; } mod = sigma % 11; cd = (mod <= 1) ? 0 : 11 - mod; return cd; } int main(void) { char s[13]; while (scanf("%12[0-9]%*[^0-9]", s) == 1 && strlen(s) == 11) { int d[11]; int i; /* 各桁の数字を読み込む */ for (i = 0; i < 11; i++) { d[i] = s[11-1-i] - '0'; } /* チェックディジットを出力する */ printf("%d\n", IndividualNumberCD(d)); } return 0; }
入力例
11111111111 22222222222 33333333333 44444444444 55555555555 66666666666 77777777777 88888888888 99999999999 12345678901 31415926535
出力例
8 5 2 0 7 4 1 9 6 8 2