みなためラボ

【C言語】3の倍数と3のつく数字だけを表示するプログラム

文字サイズ

はじめに

どうも! みなため(@MinatameT)です。

今回は、「3の倍数と3のつく数字だけを表示するプログラム」のソースコードと実行結果を紹介します。ただし、扱う数字の範囲は1から99までとします。

今回の記事は(私の書く内容にしては)難易度がやや高いですが、頑張って理解していきましょう。

必要な文法

ポイント
  • floor関数を使うので、#include<math.h>を忘れずに宣言しておいてください。
  • x = floor(a) で、aの小数部分をすべて切り捨てた値をxに代入します。例えば、a = 1.89ならx = 1となります。
  • f = modf(a,&i) で、aの整数部分をiに、小数部分をfに代入します。データ型は原則すべてdouble型です。例えば、a = 1.23なら、i = 1、f = 0.23となります。

これらを踏まえて、ソースコードと実行結果を確認していきます。ただし、これは「解答例」ですので、他のやり方もあります

3の倍数と3のつく数字だけを表示するプログラム

ソースコード

#include<stdio.h>
#include<math.h>

int main(void)
{
  int n,f;
  double i;
	
  for(n=1; n<=99; n=n+1) //1から99の範囲
  {
    if((n%3)==0) //3の倍数なら
    {
      printf("%d\n",n);
    }
    else
    {
      f = (modf(((double)n/(double)10),&i))*10 + 0.1; //1の位を抽出する。
      
      if((floor(n/10))==3) //10の位が「3」なら
      {
        printf("%d\n",n);
      }
      else if(f==3) //1の位が「3」なら
      {
        printf("%d\n",n);
      }
    }
  }

  return(0);
}

まず、nが3の倍数であることを判定するために、nを3で割ったあまりを求めます。そして、それが0かどうかを確認します。このとき、0であれば3の倍数です。

3/3=1のあまりは0ですし、6/3=2のあまりも0ですし、9/3=3のあまりも0だからですね。

f = で始まる行についてですが、この行では1の位を抽出しています。やっていることのイメージとしては、次の手順のとおりです。

1の位を抽出する流れ
  1. 例えば、「73」の1の位を抽出するとします。
  2. 「73/10」をして「7.3」になりました。
  3. 「7.3」の小数部だけを抽出して「0.3」になりました。
  4. 「0.3」を10倍して「3」になりました。これで、「73」の1の位である「3」が抽出できました。

「(double)n/(double)10」でn/10を計算していますが、modf関数の中ではdouble型を使う必要があるので、int型からdouble型に型キャスト(変換)しています。型キャストは、変数の前に(double)をつければOKです。

&iは、iにn/10の整数部分を代入していますが、今回、iは使いません(本当はif文で使えるのですが、わかりにくいので使っていません。)。したがって、&iは無視してください

n/10の小数部を10倍したものに+0.1しています。10倍する理由は、nの1の位を抽出するためです。しかし、このままだと誤差が発生する場合があります。

+0.1する理由は、n/10の結果に発生した誤差を補正するためです。double型の割り算の計算結果は、例えば、9.00のはずが誤差で8.99になる(実際はもっと小さな誤差です。)……といったことがあるので、+0.1をして補正しています。

fはint型なので、小数部は勝手に切り捨てられます。例えば、8.11は8になります。

このように、「n/10の小数部」を10倍して+0.1したものをf(int型)に代入することで、nの1の位をfに抽出できます。

ちなみに、nの10の位は、n/10の小数部を切り捨てることで抽出できます。

実行結果

3
6
9
12
13
15
18
21
23
24
27
30
31
32
33
34
35
36
37
38
39
42
43
45
48
51
53
54
57
60
63
66
69
72
73
75
78
81
83
84
87
90
93
96
99

見事、3の倍数と3のつく数字だけが表示されました!

今回はなかなか難しかったと思います。皆さん、お疲れ様でした。


 

みなためじゃんけん

このコーナーは、私と擬似的にじゃんけんできるコーナーです。

みなためじゃんけん、じゃんけんぽん!

私が出したのは……





パー

パーでした! チョキの勝利です!



この記事をSNSでシェアする

プログラミングカテゴリーの最新記事(5件)

最新記事(10件)

管理人のTwitter

内部リンク集