本サイトAIZU ONLINE JUDGE ITP1_5_D へはこちらから
問題:構造化プログラミング
goto 文は、C/C++言語などで使うことのできる文で、実行されると無条件に指定されたラベルに処理が飛びます。例えば goto CHECK_NUM; という文が実行されると、プログラムの中で CHECK_NUM: と書かれた行に処理が移ります。この機能を使って、繰り返し処理なども実現することができます。
一方、goto 文は自由度が高すぎ、プログラムの可読性に影響するため、可能な限り使わないことが推奨されています。
次のC++言語のプログラムと同じ動作をするプログラムを作成してください。ただし、goto 文は使わないで実装してみましょう。
void call(int n){
int i = 1;
CHECK_NUM:
int x = i;
if ( x % 3 == 0 ){
cout << " " << i;
goto END_CHECK_NUM;
}
INCLUDE3:
if ( x % 10 == 3 ){
cout << " " << i;
goto END_CHECK_NUM;
}
x /= 10;
if ( x ) goto INCLUDE3;
END_CHECK_NUM:
if ( ++i <= n ) goto CHECK_NUM;
cout << endl;
}
Input
1つの整数 n が1行に与えられます。
Output
上記プログラムに入力の整数 n を与えた結果を出力してください。
Constraints
- 3 ≤ n ≤ 10000
Sample Input
30
Sample Output
※先頭に空白を出力することに注意してください。
3 6 9 12 13 15 18 21 23 24 27 30
解答例
n = int(input())
for i in range(1, n+1):
if i % 3 == 0 or "3" in str(i):
print(" {}".format(i), end="")
print()
解説
まずは、問題の意味を理解します。
1から入力された値nまで+1ずつカウントアップされていく中で、3で割り切れる数または3がつく数を小さいものから順に出力している事がわかります。つまり、n以下の自然数のうち、3の倍数もしくは3がつく数を小さいものから順に出力するプログラムを組んでいきます。
void call(int n){
// iに1が設定される
int i = 1;
CHECK_NUM:
// xに初期値として1が設定され、それ以降はiに+1されて以下の処理が行われる
int x = i;
// 3で割り切れる場合(3の倍数の場合)
if ( x % 3 == 0 ){
// 3の倍数を表示
cout << " " << i;
// END_CHECK_NUMへ
goto END_CHECK_NUM;
}
INCLUDE3:
// 10で割った余りが3の場合(3がつく数字の場合)
if ( x % 10 == 3 ){
// 3がつく数を表示
cout << " " << i;
// END_CHECK_NUMへ
goto END_CHECK_NUM;
}
// xを10で割りxに再設定
x /= 10;
// xが0より大きい場合、INCLUDE3へ
if ( x ) goto INCLUDE3;
END_CHECK_NUM:
// iを+1カウントアップ → n以下の場合CHECK_NUMへ
if ( ++i <= n ) goto CHECK_NUM;
// 終了処理
cout << endl;
}
よって、以下のように解いていきます。
1つの整数の読み込み
キーボードから文字列を受け取るときに使用するinput関数をint関数で囲み、整数値として受け取ります。
# input関数をint関数で囲み、整数値として変数に代入
n = int(input())
※サイト内「AIZU ONLINE JUDGE ITP1_1_Bをpythonで解いてみた」の、input関数とはにinput関数の使用方法が書かれておりますのでぜひご覧ください。
3の倍数もしくは3がつく数の表示
for文の条件式にrange(1, n+1)を設定し、1 から n+1 までfor文を回します。
※n + 1とするのは、range(開始値, 終了値)を設定すると、終了値であるbは含まれないため。例えば、range(5)の場合0~4までの5つの数字が取り出されます。
続いて、if文の条件式で3の倍数つまり、3で割った余りが0の場合または、3がつく数の場合にその数字を表示します。
3で割った余りが0の場合、余りを求める演算子は%なので、条件式はi % 3 == 0となります。
3がつく数の場合は注意が必要です。演算子 in を使用し、繰り返し可能なオブジェクトから当てはまる値があるか判定します。今回は、一度str関数でstr型に変換した後にその中に”3″があるか確認します。
str型は複数の要素が入った繰り返し処理可能なオブジェクトです。そのため、入力した値を一文字ずつ取り出し、”3″であるか確認します。
例えばiが”13″の場合はまず”1″が取り出され”3″であるか確認、続いて”3″が取り出され”3″であるか確認、”3″であるのでif文の中に入るという事になります。
表示にはformat関数を使用して、空白+3の倍数もしくは3がつく数を表示しています。
※{}の前に空白が設定されています。
n = int(input())
# 1 からn+1までfor文を回す
for i in range(1, n+1):
if i % 3 == 0 or "3" in str(i):
# 3で割った余りが0または、3がつく数の表示
print(" {}".format(i), end="")
print()
※サイト内「AIZU ONLINE JUDGE ITP1_1_Dをpythonで解いてみた」の、format関数とはにformat関数の使用方法が書かれておりますのでよかったらご覧ください。
最後に、もう一度プログラムを確認してみましょう。
# input()で受け取った値をint関数で囲み、int型として受け取る
n = int(input())
# 1 からn+1までfor文を回す
for i in range(1, n+1):
if i % 3 == 0 or "3" in str(i):
# 3で割った余りが0または、3がつく数の表示
print(" {}".format(i), end="")
print()
コメント