Go 言語で「基礎プログラミング演習 I 〜100 本ノック中級編」を解いてみる-No.51「お支払い」

はじめに

「基礎プログラミング演習 I 〜100 本ノック中級編」を解いてみます。

取り扱う問題は以下のサイトを引用させていただきました。

検証環境

1
2
3
4
5
6
7
8
9
$ uname -moi
x86_64 unknown GNU/Linux

$ head -n 2 /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"

$ go version | head -n 1
go version go1.16.3 linux/amd64

問題

No. 51 お支払い

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

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

回答

knock51.go

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package main

import (
	"fmt"
	"strings"
)

func main() {
	var price int

	fmt.Printf("input money: ")
	fmt.Scan(&price)

	coins := []int{
		100,
		10,
		1,
	}

	outputs := make([]string, len(coins))

	for i, coin := range coins {
		outputs[i] = fmt.Sprintf("%v円玉%v枚", coin, price/coin)
		price = price % coin
	}

	fmt.Println(strings.Join(outputs, ", "))
}

実行

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ go run knock51.go
input money: 12345
100円玉123枚, 10円玉4枚, 1円玉5枚

$ go run knock51.go
input money: 100
100円玉1枚, 10円玉0枚, 1円玉0枚

$ go run knock51.go
input money: 7
100円玉0枚, 10円玉0枚, 1円玉7枚

ひとこと

5 円玉を追加した場合でも、改修は 1 行追加で実現できます。