基礎プロI 100本ノック 中級編

No. 40 even or odd

整数値を入力させ、その値が偶数ならばeven、奇数ならばoddと表示するプログラムを作成せよ。

【実行例、下線部は入力例】
$ ./knock40
input number: 6
6 is even.
$ ./knock40
input number: 7
7 is odd.
$

偶数=2で割り切れる=2で割った余りが0

No. 41 1桁の自然数?

整数値を入力させ、その値が一桁の自然数かそうでないか判定するプログラムを作成せよ。

【実行例、下線部は入力例】
$ ./knock41
input number: 6
6 is a single figure.
$ ./knock41
input number: 10
10 is not a single figure.
$ ./knock41
input number: -3
-3 is not a single figure.
$ ./knock41
input number: 0
0 is not a single figure.
$

一桁の自然数=0より大きく、かつ、9以下の整数、として判定すればよい。

No. 42 小さい順?

整数値を3つ入力させ、それらの値が小さい順(等しくてもよい)に並んでいるか判定し、小さい順に並んでいる場合はOK、そうなっていない場合はNGと表示するプログラムを作成せよ。

【実行例、下線部は入力例】
$ ./knock42
input number 1: 1
input number 2: 2
input number 3: 3
OK
$ ./knock42
input number 1: 1
input number 2: 1
input number 3: 3
OK
$ ./knock42
input number 1: 2
input number 2: 1
input number 3: 3
NG
$

No. 43 2次方程式の解の判別

2次方程式 ax^2 + bx + c = 0 (x^2はxの2乗の意味)の係数a, b, cを入力し、2次方程式の解が2つの実数解か、重解か、2つの虚数解かを判別するプログラムを作成せよ。

【実行例、下線部は入力例】
$ ./knock43
input a: 4
input b: -3
input c: 1
2つの虚数解
$ ./knock43
input a: 1
input b: 2
input c: 1
重解
$ ./knock43
input a: 3
input b: 2
input c: -4
2つの実数解
$

No. 44 通貨換算

換算したい金額(円単位)と1ドル何円かを整数値で入力すると、入力した金額が何ドル何セントか計算して表示するプログラムを作成せよ。1セントは1/100ドルである。結果は整数値でよい(1セント未満の端数切り捨て)。

【実行例、下線部は入力例】
$ ./knock44
何円? 10000
1ドルは何円? 120
10000円は83ドル33セント
$ ./knock44
何円? 15000
1ドルは何円? 125
15000円は120ドル0セント
$

まず何ドルになるかを整数値で計算する。次に、1ドルに満たない金額をセントに換算する。浮動小数点型の変数を使ってもよいが、使わない方法を考えてみよう。

No. 45 タクシー料金

初乗り料金が1700mまで610円、それ以降は313mごとに80円のタクシーがある。このタクシーに乗った距離をm単位で入力し、料金を計算するプログラムを作成せよ。

【実行例、下線部は入力例】
$ ./knock45
距離 10000
金額 2770
$ ./knock45
距離 2013
金額 690
$ ./knock45
距離 2014
金額 770
$

313mごとの区間は1mでも進んでしまったら80円かかることに注意。

No. 46 入場料

神山美術館の入場料金は、一人600円であるが、5人以上のグループなら一人550円、20人以上の団体なら一人500円である。人数を入力し、入場料の合計を計算するプログラムを作成せよ。

【実行例、下線部は入力例】
$ ./knock46
人数 3
料金 1800
$ ./knock46
人数 7
料金 3850
$ ./knock46
人数 22
料金 11000
$

No. 47 値の入れ替え

異なる整数値を2つ入力し、それぞれ別の変数に格納する。そして、それらの変数の値を入れ替えた後、それぞれの変数の値を表示するプログラムを作成せよ。単に順序を変えて表示するだけではダメ。必ず変数の値を入れ替えること。下の実行例の場合、まず変数aに2、bに5が入力された状態から、aの値が5、bの値が2になるように入れ替える。

【実行例、下線部は入力例】
$ ./knock47
input a: 2
input b: 5
a = 5, b = 2
$

No. 48 繰り返し計算

最初に2以上の整数値を入力し、次の規則で計算し、計算回数と計算結果を表示し、計算結果が1になるまで繰り返すプログラムを作成せよ。
規則:ある値が偶数ならその値を1/2にする。奇数ならその値を3倍して1を足す。

【実行例、下線部は入力例】
$ ./knock48
input number: 3
1: 10
2: 5
3: 16
4: 8
5: 4
6: 2
7: 1
$

No. 49 九九

九九の表を、2重の繰り返しを使って表示するプログラムを作成せよ。2重の繰り返しを使わず単に表示するだけではダメ。値の間はタブ(\t)を使って間をあけること。

【実行例】
$ ./knock49
1	2	3	4	5	6	7	8	9	
2	4	6	8	10	12	14	16	18	
3	6	9	12	15	18	21	24	27	
4	8	12	16	20	24	28	32	36	
5	10	15	20	25	30	35	40	45	
6	12	18	24	30	36	42	48	54	
7	14	21	28	35	42	49	56	63	
8	16	24	32	40	48	56	64	72	
9	18	27	36	45	54	63	72	81
$

No. 50 foobar

1から100までの値を繰り返しで表示するが、3の倍数の時はfoo、5の倍数の時はbarと数字の代わりに表示するプログラムを作成せよ。なお、3と5の両方の倍数の時はfoobarと表示される。

【実行例】
$ ./knock50
1
2
foo
4
bar
foo
(途中省略)
97
98
foo
bar
$

No. 51 お支払い

指定した金額を100円玉と10円玉と1円玉だけで、できるだけ少ない枚数で支払いたい。金額を入力するとそれぞれの枚数を計算して表示するプログラムを作成せよ。

【実行例、下線部は入力例】
$ ./knock51
input money: 12345
100円玉123枚, 10円玉4枚, 1円玉5枚
$

問題文は「できるだけ少ない」となっているが、金額の大きな硬貨を優先して使うように計算すれば自然とそうなる。

No. 52 閏年

西暦を入力したらその年が閏(うるう)年かどうかを判定するプログラムを作成せよ。なお、4で割り切れる年のうち、100で割り切れないか、400で割り切れる年は閏年である。

【実行例、下線部は入力例】
$ ./knock52
input year: 2015
2015年は閏年でない
$ ./knock52
input year: 2016
2016年は閏年である
$ ./knock52
input year: 2100
2100年は閏年でない
$ ./knock52
input year: 2000
2000年は閏年である
$

No. 53 素因数分解

自然数の入力値を素因数分解して結果を表示するプログラムを作成せよ。

【実行例、下線部は入力例】
$ ./knock53
input number: 840
2 2 2 3 5 7 
$

まず2で割り切れる間は割っていき、2で割り切れなくなったら3で、と、割る数を1ずつ大きくしながら繰り返す。

No. 54 最大最小

まずデータの個数を入力させ、次にデータの個数だけ整数値を入力させる。この入力データの中で最大値と最小値を求め表示するプログラムを作成せよ。データの個数は100個までとする。なお、データの個数とデータはファイルからリダイレクトで入力させればよいので、入力のためのメッセージは不要である(実行例を参照すること)。

【実行例、データファイルは下のリンクから取得せよ】
$ ./knock54 < small.data
最小値 = 128, 最大値 = 962
$ ./knock54 < middle.data
最小値 = 20, 最大値 = 988
$ ./knock54 < large.data
最小値 = 5, 最大値 = 996
$

リダイレクトでデータを入力するプログラム例はこちら redirect.c

入力データはこちら(右クリックで「リンク先をダウンロード」。ブラウザの設定によってはファイルの拡張子に.txtが追加されるが、その場合は適宜変更すること。「別名でダウンロード」を選んで、プログラムを置いているディレクトリに保存するとよい。)
small.data
middle.data
large.data

No. 55 夢想花again

「とんで」を9回「まわって」を3回繰り返した後「まわる」と表示して改行する、を3回繰り返すプログラムを作成せよ。「とんで」「まわって」と3行文の繰り返しは必ず繰り返し構文を使うこと。

【実行例】
$ ./knock55
とんでとんでとんでとんでとんでとんでとんでとんでとんでまわってまわってまわってまわる
とんでとんでとんでとんでとんでとんでとんでとんでとんでまわってまわってまわってまわる
とんでとんでとんでとんでとんでとんでとんでとんでとんでまわってまわってまわってまわる
$

No. 56 2進数変換

0〜65535の整数値を入力させ、入力値を16桁の2進数に変換して表示するプログラムを作成せよ。

【実行例、下線部は入力例】
$ ./knock56
input number: 127
0000000001111111
$ ./knock56
input number: 10000
0010011100010000
$ ./knock56
input number: 65535
1111111111111111
$

ヒント:16桁分の2進数を記憶する配列を用意する。2で割った余り(0か1)を最初の桁の値とし、2で割った値を新たな値とし、さらに2で割った余りを次の桁の値とする。これを繰り返していけば1の桁から順に値が求まるので、表示するときは逆順に表示すればよい。

No. 57 テスト集計

まず受験者数を入力させ、次に受験者数ごとに英語、数学、国語の点数をスペースで区切って入力させる(具体的な入力方法は下記のscanfの使い方の説明、および入力データの中身を見よ)。入力が終了したら、英語、数学、国語の平均点、および各受験生の合計点を計算して表示するプログラムを作成せよ。受験者数は100人までとする。なお、データの個数とデータはファイルからリダイレクトで入力させればよいので、入力のためのメッセージは不要である(実行例を参照すること)。

【実行例、データファイルは下のリンクから取得せよ】
$ ./knock57 < examSmall.data
平均点 英語:46, 数学:51, 国語:55
個人合計点
0: 141
1: 114
(途中省略)
8: 96
9: 188
$ ./knock57 < examMiddle.data
平均点 英語:55, 数学:53, 国語:54
個人合計点
0: 136
1: 64
(途中省略)
48: 265
49: 167
$ ./knock57 < examLarge.data
平均点 英語:52, 数学:51, 国語:51
個人合計点
0: 151
1: 241
(途中省略)
98: 107
99: 178
$

複数の値をスペースで区切って一度に入力させるには、次のようにscnaf関数の書式指定文字列を使う:

scanf("%d %d %d", &eng, &math, &lang);

入力データはこちら(右クリックで「リンク先をダウンロード」)
examSmall.data
examMiddle.data
examLarge.data

No. 58 棒グラフ

0以上の整数値を5つ入力させ、それぞれの値に対して、次の形式でグラフを描くプログラムを作成せよ。
形式:左端に値を表示し、適切に空白を空けて":"を書く(:で揃えるためにタブ\tを使うとよい)。その後ろに値の数だけ*を描くが、5個おきに空白を1つ入れる。具体例は下記の実行例を参照すること。

【実行例、下線部は入力例】
$ ./knock58
input data[0]: 7
input data[1]: 10
input data[2]: 14
input data[3]: 15
input data[4]: 21
7	:***** **
10	:***** ***** 
14	:***** ***** ****
15	:***** ***** ***** 
21	:***** ***** ***** ***** *
$

ヒント:入力値は配列に格納する。グラフを描くためには、値のループと、*を描くループの二重ループとなる。

No. 59 行列の和

3x3行列の和を求めて表示するプログラムを作成せよ。行列の値は2次元配列で表現し、繰り返しを使って計算すること。
3x3行列とは縦3つ、横3つの9つの要素(値)をひとまとめにして扱うものである。2つの3x3行列の和は次式のように、それぞれ同じ位置にある値を足したものとして計算できる。

例えばa12という要素は、1行目2列目の要素という意味である。それぞれ同じ位置にある要素を足せばよい。
なお、入力値は1行ずつ3つの値をスペースで区切って入力するようにするとよい。このためには、scanf("%d %d %d", &a[0][0], &a[0][1], &a[0][2]);のように書く(No. 57参照)。

【実行例、下線部は入力例】
$ ./knock59
1つめの行列
1 2 3
4 5 6
7 8 9
1つめの行列
2 3 4
5 6 7
8 9 1
和
3	5	7	
9	11	13	
15	17	10	
$

C言語の配列の添字は0から始まることに注意。上記の実行例で、和の行列の表示は各列の値を揃えるためにタブ(\t)を使っている。