基本情報技術者 2017年 秋期 午前(科目A) 問24
問題文
次の方式によって求められるチェックデジットを付加した結果はどれか。ここで、データを7394、重み付け定数を1234、基数を11とする。
〔方式〕
(1) データと重み付け定数の、対応する桁ごとの積を求め、それらの和を求める。
(2) 和を基数で割って、余りを求める。
(3) 基数から余りを減じ、その結果の1の位をチェックデジットとしてデータの末尾に付加する。
選択肢
ア:73940(正解)
イ:73941
ウ:73944
エ:73947
🔒 解説は解答すると表示されます
チェックデジット算出【午前解説】
正解の理由
与えられた方式に従うと、データ7394に付加するチェックデジットは0になり、選択肢のうち ア の73940が正解です。計算手順は「各桁の積の和を基数で割った余り」を求め、その余りを基数から引いた結果の1の位をチェックデジットとして末尾に付ける、というものです。ここで実際に得られる余りは1で、基数から差し引いた結果は10、その1の位は0になります。
解法ステップ
- 桁ごとの対応を並べ、積を求める。
- 積の和を求める。
- 和を基数で割った余りを求める。
- 基数から余りを減じ、その1の位をチェックデジットとする。
の1の位は - データの末尾にチェックデジットを付けると73940 → すなわち ア。
選択肢別の誤答解説
-
ア: 73940
正しい。上の手順どおりチェックデジットは0となる。 -
イ: 73941
これは「余りをそのままチェックデジットとして付加した」場合に得られる結果です。今回の余りはなので、余りを直接末尾に付ける誤りをすると73941になります。注意点として、基数−余りの結果が(二桁)であってもそれを二桁そのまま付加すると739410になります(選択肢ではない)。したがって73941は「余り1をそのまま付加した」誤りに対応します。 -
ウ: 73944
これは基数を誤ってと扱った場合に対応します。もし基数をと誤認すると、、でチェックデジットがになり、73944となります。つまり「基数の取り違え(11→10)」による典型的なミスです。 -
エ: 73947
これは桁と重みの対応を逆にして計算した場合に生じる値の一例です。重みを逆に当てると積和がとなり、、でチェックデジットが、結果73947になります。重み付けの位置合わせミスに注意してください。
よくある誤解
- 「基数−余り」をそのまま末尾に付ければよいと考える誤り:結果が二桁(例:10)のときは「その1の位」を取る点を忘れがち。二桁をそのまま付けると桁数が変わるため問題の定義に合わなくなる。
- 余りとチェックデジットの混同:余り(今回1)を直接用いるのか、基数から余りを引いたものの1の位を用いるのか手順を混同すると誤答になる。
- 重みの位置合わせミスや基数の取り違え:桁対応や基数が問題で指定された値と違うと、まったく別の結果になる。
補足コラム
この方式は「重み付けによる桁別積和→モジュロ演算→補数を使う」タイプのチェックデジット算出法の一種です。似た考え方はISBN-10のチェックにも見られます(ただしISBN-10では余りが10のときに'X'を使うなど取り扱いが異なる点に注意)。実務では誤入力防止のため、どの段階で何を取るのか(余りか補数か、そのままか1の位か)を仕様で明確にしておくことが重要です。
FAQ
Q: 基数−余りが0になったらチェックデジットはどうなる?
A: 例:余りが11の場合(通常は0≤余り<11なので起きませんが)、規定どおり基数−余りの1の位を取れば結果が0になります。余りが0の場合はで1の位は1になる設計もあり得ます。問題ごとに仕様を確認してください。
A: 例:余りが11の場合(通常は0≤余り<11なので起きませんが)、規定どおり基数−余りの1の位を取れば結果が0になります。余りが0の場合はで1の位は1になる設計もあり得ます。問題ごとに仕様を確認してください。
Q: なぜ1の位だけを取るのですか?
A: チェックデジットは通常1桁で定義されるため、補数の1桁分のみを採用する設計です。複数桁を許す仕様であれば別の手順になります。
A: チェックデジットは通常1桁で定義されるため、補数の1桁分のみを採用する設計です。複数桁を許す仕様であれば別の手順になります。
Q: 計算途中で小さな算誤が起きやすいです。検算方法は?
A: 桁別積和を別の順序で再計算する、あるいは簡単な電卓やスクリプトで確認するのが確実です。例としてPythonで検算する小コード:
A: 桁別積和を別の順序で再計算する、あるいは簡単な電卓やスクリプトで確認するのが確実です。例としてPythonで検算する小コード:
data = [7,3,9,4]
weight = [1,2,3,4]
s = sum(d*w for d,w in zip(data, weight))
r = s % 11
check = (11 - r) % 10
print(s, r, check) # 56 1 0
関連キーワード: チェックデジット、重み付け定数、モジュラス演算、余り、MOD11、桁別積和、検算

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

