
共通テスト2024 数学I・数学Aの進数タイマーをC言語で作ってみた
はじめに
今回は、先日行われた共通テスト2024で話題となった「進数タイマー」をC言語を用いて作ったので、進数の概要とともに紹介する。
進数の概要
進数とは
進数とは、簡単に言えば数をどのように表すか。2、48、943などの数を、私たちは0から9までの数字で表している。0から9まで数字10個で表すので、「10進数」で表記していることになる。0から1ずつ増えていき、9の次はまた0になってしまうが、ここでくり上がりで10の位が0から1になる。10の位も9の次は0となり、くり上がりで100の位が1になる…というようなルールで成り立っている。
「n進数」の考え方
「10進数」の仕組みが分かったので、今度は「2進数」について考えていく。「10進数」の時は0から9までの10個だったので、同じように考えて、「2進数」の時は0から1までの数字2個で表す。『0と1だけで本当にどんな数も表せるのか。』そう思う人もいるだろう。表せている証明は後にして、まずはどのように表すのかを見ていく。
「10進数」の時のようにしていくと、0、1、1の次はないのでまた0に戻る。そしてこの時にくり上がりが発生するので、10となる。十ではなく、いちぜろと読む。数字の増加を続けていくと、11、100、101、110…と表されていく。
コンピュータには「16進数」もよく使われているので、「16進数」の例も説明する。「"16"進数」なので数字は0から15…と思いきや、各桁1文字にしたいので、10から15をAからFで表す。ちなみに、「n進数」のnが11以上なら大文字のアルファベットも使う。
0から1ずつ増えていき、9の次はA、B...Eまでいくと次はないのでまた0に戻る。くり上がりが発生するので10。これを続けていき、9Eの次はA0など
となっていく。
「n進数」で本当に表せているのか
ここまで「10進数」、「2進数」「16進数」の例を見てきたが、「2進数」や「16進数」は私たちが普段使っている「10進数」とルールが違うためよく理解できない人もいるだろう。ここからは「n進数」をほかの進数に変換する方法を使いながら「n進数」が本当に表せていることを説明する。
「n進数」を「10進数」に変換する
①各桁の値にn^(桁数-1)をかける
②求めた値をすべて足す
例として(1011)₂を「10進数」に変換してみる(図1参照)。

(1011)₂は「10進数」で11となった。実際に「2進数」を0から数えてみると
0、1、10、11、100、101、110、111、1000、1001、1010、1011
と、ちゃんと11であることが分かる。
別の変換も見てみよう。(1DE)₁₆を「10進数」に変換する(図2参照)。

変換の仕方に従うと、「16進数」なので16^nとなる。(1DE)₁₆は「10進数」で478になる。
ここまで、進数の概要を見てきた。ではここまでのことをふまえ、n進数タイマーの構造についてみていこう。
進数タイマー
進数タイマーの紹介
共通テストに出てきた「進数タイマー」について説明する。
ーーーーーーーーーー
表示方法
(a)スタートした時点でタイマーは000と表示されている。
(b)タイマーは、スタートした後、表示される数が1秒ごとに1ずつ増えていき、3桁で表示できる最大の数が表示された1秒後に、表示が000に戻る。
(c)タイマーは表示が000に戻った後も、(b)と同様に、表示される数が1秒ごとに1ずつ増えていき、3桁で表示できる最大の数が表示された1秒後に、表示が000に戻るという動作を繰り返す。
(共通テスト2024数学IAより)
ーーーーーーーーーー
各進数が「10進数」の「1」ずつ増えていき表示可能範囲を超えたら000に戻っていく。
進数タイマー -C言語-
以下にC言語で作成した進数タイマーのプログラムを掲載する。
#include<stdio.h>
int main()
{
int a3=0;
int b3=0;
int c3=0;
int a4=0;
int b4=0;
int c4=0;
int a6=0;
int b6=0;
int c6=0;
while(1)
{
printf("%d%d%d ",a3,b3,c3);
printf("%d%d%d ",a4,b4,c4);
printf("%d%d%d\n",a6,b6,c6);
printf(" \n",a6,b6,c6);
c3++;
c4++;
c6++;
if(c3==3)
{
c3=0;
b3++;
if(b3==3)
{
b3=0;
a3++;
if(a3==3)
{
a3=0;
}
}
}
if(c4==4)
{
c4=0;
b4++;
if(b4==4)
{
b4=0;
a4++;
if(a4==4)
{
a4=0;
}
}
}
if(c6==6)
{
c6=0;
b6++;
if(b6==6)
{
b6=0;
if(a6==6)
{
a6=0;
}
}
}
sleep(1); // 1秒待つ
}
return 0;
}
ぜひ実行して確認してみてください。
終わりに
今回は共通テストの進数タイマーを作ってみました。プログラム自体は単純なので、改変などして理解を深めてください。めんどくさがって記事完成までに時間を要してしまったので次回はささっと完成させたいです。