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