もふふのはてな

メインのブログに書くほどではない雑多な記事を置く場所

マイナンバーのチェックディジットを計算するプログラム(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

参考