この記事を読むことで、PythonとGASで標準入力で被除数(割られる数N)・除数(割る数M)を取得し、whileループを使って、任意の数(M)で何回割ることが出来るのか回数を数える方法が学べます。
どちらのコードでも割り算の過程や変数の値の変化を追いやすい様に、トレースのコードを設けています。
ループの最初にIF文で割り切れない(余りが0ではない)場合はbreakでループを抜けるようにしています。
このコーナーでは、学習コンテンツpaizaラーニングのレベルアップ問題集をPythonとGASの両方で解いて全コードの解説をしています。
PythonとGASの両方のコードを用いて、全コード及び部分的にも可能な限り詳細に記載いたしました。
GASはスプレッドシートを使っています。
GASはGoogle Apps Scriptと言って、JavaScriptの文法をベースにしているので、JavaScriptの学習中の方にもお役立て出来るかも知れません。
paizaレベルアップ問題集でPythonとGASを解いて見たに戻る
メインメニューに戻る
Python自作サンプル
GASサンプル
基本情報技術者試験
paizaでの解答はPythonで行いましたが、この記事ではPythonのコードと共に、同じ問題を現在学習中のGASだったらどう解くのか、スプレッドシートでバインドして作ってみました。
問題:
整数 N, M が与えられます。
N が何回 M で割れるかを求め、出力してください。
この記事では、下記の入力例3の場合にリストの個数N=81,M=3として81が3で何回で割れるかを求めます。
入力例3
81 3
出力例3
4
ではまず、Pythonで解いてみます。
今回は、paiza.ioを使って解きます。paiza.ioの使い方はこちらから。
■ Pythonでの解き方 ■
下準備として、paiza.ioにこの様に入力します。
(入力例1をそのままioにコピーしただけ。)
手順として、
1:数値N=81,M=3を取得する
2:割り算を実行する処理の回数をcountで求めるので、count変数を0で初期化する
3:ループの最初にNがMで割り切れない場合は、breakでループを抜けるよう設定しています。
whileループでNがM以上という条件を満たす間、ループを回します。
Mで割っていくのにNが2.999などの数ですと、割り切ることが出来ないからです。
4:ループの中で割り算を実行します。
5:countをインクリメントします。
6:countを表示します。
で、行います。
まずは、プログラムの各変数の動きを追いやすいように、トレースのio出力結果と、トレースのコードを添えます。
1回目の除算
2回目の除算
3回目の除算
4回目の除算
#被除数Nと除数Mを標準入力で取得
N,M=map(int,input().rstrip().split(' '))
#NをMで割れる回数を格納する変数countを初期化する
count=0
print('<<<ループに入る>>>')
#whileループでNがM以上で尚且つ割り切れる条件の時にループを回す
while N>=M:
print('除算前のcount:【'+str(count)+'回】')
print('除算前のN:'+str(N))
if N%M!=0:
break
#除算実行
print('---「'+str(N)+'÷'+str(M)+'」を実行---')
N/=M
#countのインクリメント
count+=1
print('除算後のcount:【'+str(count)+'回】')
print('除算後のN:'+str(N))
#ループの区切り
print('-------------------')
print('<<<ループを抜けた>>>')
print(count)
このままでは、出力結果である出力例3に対して冗長なコードが含まれているので、解答以外のprint文をコメントアウトします。
#被除数Nと除数Mを標準入力で取得
N,M=map(int,input().rstrip().split(' '))
#NをMで割れる回数を格納する変数countを初期化する
count=0
#print('<<<ループに入る>>>')
#whileループでNがM以上で尚且つ割り切れる条件の時にループを回す
while N>=M:
#print('除算前のcount:【'+str(count)+'回】')
#print('除算前のN:'+str(N))
if N%M!=0:
break
#除算実行
#print('---「'+str(N)+'÷'+str(M)+'」を実行---')
N/=M
#countのインクリメント
count+=1
#print('除算後のcount:【'+str(count)+'回】')
#print('除算後のN:'+str(N))
#ループの区切り
#print('-------------------')
#print('<<<ループを抜けた>>>')
print(count)
スッキリするように、コメントアウトした部分を省いたコードです。
#被除数Nと除数Mを標準入力で取得
N,M=map(int,input().rstrip().split(' '))
#NをMで割れる回数を格納する変数countを初期化する
count=0
#whileループでNがM以上で尚且つ割り切れる条件の時にループを回す
while N>=M:
if N%M!=0:
break
#除算実行
#print('---「'+str(N)+'÷'+str(M)+'」を実行---')
N/=M
#countのインクリメント
count+=1
print(count)
ioの出力結果です。
■ GASでの解き方 ■
では、同じ問題をGASで解いてみます。
まず、スプレッドシートにこの様に配置しました。
スプレッドシートの黄色いセルの所に「Mで割り切れた回数」を出力します。
割り切れた回数は変数countに格納します。
また、countを二次元配列count2に追加して、スプレッドシートに出力します。
※スプレッドシートに表示する場合は、ループを使って一次元配列ではなく、二次元配列としてからの配列に追加をして作成します※
手順はこのようになります。
1:スプレッドシートからアクティブシートをアクセスする
2:スプレッドシートの緑色のセルから割られる数の被除数N(この例では「81」)を取得する
3:スプレッドシートの灰色のセルから割る数の除数M(この例では「3」)を取得する
4:割り切れた回数を格納する変数countを宣言して0で初期化する
5:whileループでNがM以上という条件を満たす時にループを回す。
また、IF文でNをMで割り切れない(N%Mが0では無い)場合にはループを抜ける。
除算を実行して、割り切れた回数のcountをインクリメントする。
6:スプレッドシートに出力する二次元配列配列count2を宣言する
7:countをcount2に二次元配列として追加する
8:スプレッドシート出力前に二次元配列count2のログ出力で確認する
9:スプレッドシートの黄色いセルに割り切れた回数が格納された二次元配列count2を出力する
手順1: スプレッドシートからアクティブシートをアクセスする
const ss=SpreadsheetApp.getActiveSheet();
ここで定数ssにSpreadsheetAppから階層を辿ってアクティブシートにアクセスしています。
手順2: スプレッドシートの緑色のセルから整数N(この例では「10」)を取得する
let N=ss.getRange(1,2).getValue();
※Nを割っていくので、Nの値が変わる、すなわち変数なので定数のconstではなく変数のletで宣言をします※
手順3:スプレッドシートの灰色のセルから割る数の除数M(この例では「3」)を取得する
const M = ss.getRange(2, 2).getValue();
手順4:割り切れた回数を格納する変数countを宣言して0で初期化する
let count=0;
手順5:
whileループでNがM以上という条件を満たす時にループを回す。
また、IF文で、NをMで割り切れない(N%Mが0では無い)時にループを抜ける。
除算を実行して、割り切れた回数のcountをインクリメントする。
1回目の除算
2回目の除算
3回目の除算
4回目の除算
whileループの部分のコードです。
/*
whileループでNがM以上という条件を満たす時にループを回す。
また、IF文でNをMで割り切れない(N%Mが0では無い)場合にはループを抜ける。
除算を実行して、割り切れた回数のcountをインクリメントする。
*/
console.log('<<<ループに入る>>>');
while (N >= M) {
if (N % M != 0) {
break
}
console.log(`除算実行前のN:${N}`);
console.log(`除算実行前のcount:【${count}回】`);
//除算実行
N /= M;
//割り算の回数をインクリメント
count++;
console.log(`除算実行後のN:${N}`);
console.log(`除算実行後のcount:【${count}回】`);
//ループ区切り
console.log('-----------------------');
}
console.log('<<<ループを抜けた>>>');
手順6:スプレッドシートに出力する二次元配列配列count2を宣言する
let count2=[];
手順7:countをcount2に二次元配列として追加する
count2.push([count]);
手順8:スプレッドシート出力前に二次元配列count2のログ出力で確認する
console.log(count2);
手順9:スプレッドシートの黄色いセルに掛け算の計算結果が格納された二次元配列count2を出力する
ss.getRange(4, 1).setValue(count2);
GASでの全コードはこちらになります。
function loop2no9() {
//スプレッドシートからアクティブシートをアクセスする
const ss = SpreadsheetApp.getActiveSheet();
//スプレッドシートの緑色のセルから割られる数の被除数N(この例では「81」)を取得する
let N = ss.getRange(1, 2).getValue();
//スプレッドシートの灰色のセルから割る数の除数M(この例では「3」)を取得する
const M = ss.getRange(2, 2).getValue();
//割り切れた回数を格納する変数countを宣言して0で初期化する
let count = 0;
/*
whileループでNがM以上という条件を満たす時にループを回す。
また、IF文でNをMで割り切れない(N%Mが0では無い)場合にはループを抜ける。
除算を実行して、割り切れた回数のcountをインクリメントする。
*/
console.log('<<<ループに入る>>>');
while (N >= M) {
if (N % M != 0) {
break
}
console.log(`除算実行前のN:${N}`);
console.log(`除算実行前のcount:【${count}回】`);
//除算実行
N /= M;
//割り算の回数をインクリメント
count++;
console.log(`除算実行後のN:${N}`);
console.log(`除算実行後のcount:【${count}回】`);
//ループ区切り
console.log('-----------------------');
}
console.log('<<<ループを抜けた>>>');
//スプレッドシートに出力する二次元配列配列count2を宣言する
let count2 = [];
//countをcount2に二次元配列として追加する
count2.push([count]);
//スプレッドシート出力前に二次元配列count2のログ出力で確認する
console.log(count2);
//スプレッドシートの黄色いセルに割り切れた回数が格納された二次元配列count2を出力する
ss.getRange(4, 1).setValue(count2);
}
宜しかったらコピペしてアレンジして見て下さい。
お疲れ様でした、ブレイクタイムフォトはこちらになります。
よみうりランドのXmasイルミネーション、「ジュエルミネーション」から1枚、アテネの宮廷
■ 参考文献の紹介■
じっくり丁寧にPythonを学びたい方向け。
まずはpaizaラーニングなどの学習コンテンツで学んで、基礎をマスターしたら、この本でじっくりと初級から中級レベルを目指せます。
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。
GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本でじっくり学べます。
paizaレベルアップ問題集でPythonとGASを解いて見たに戻る
メインメニューに戻る
Python自作サンプル
GASサンプル
基本情報技術者試験