この記事を読むことで、PythonとGASでforループとループの中で単純なIF文を使ってリスト(配列)の中で約数の個数を求めることが出来るようになります。
このコーナーでは、学習コンテンツpaizaラーニングのレベルアップ問題集をPythonとGASの両方で解いて全コードの解説をしています。
PythonとGASの両方のコードを用いて、全コード及び部分的にも可能な限り詳細に記載いたしました。
GASはスプレッドシートを使っています。
GASはGoogle Apps Scriptと言って、JavaScriptの文法をベースにしているので、JavaScriptの学習中の方にもお役立て出来るかも知れません。
paizaレベルアップ問題集でPythonとGASを解いて見たに戻る
メインメニューに戻る
Python自作サンプル
GASサンプル
基本情報技術者試験
プログラミングのアンケートにご協力頂ける方はこちらのフォームで勉強法など色々と教えて下さい。
paizaでの解答はPythonで行いましたが、この記事ではPythonのコードと共に、同じ問題を現在学習中のGASだったらどう解くのか、スプレッドシートでバインドして作ってみました。
問題:
整数 N が与えられます。
N の約数の個数を出力してください。
約数とは、N を割り切る整数のことを指します。
この記事では、下記の入力例2の場合を例にして、標準入力でリストの要素数N=100を取得し、その約数の個数を求めます。
入力例2
100
出力例2
9
ではまず、Pythonで解いてみます。
今回は、paiza.ioを使って解きます。paiza.ioの使い方はこちらから。
■ Pythonでの解き方 ■
下準備として、paiza.ioにこの様に入力します。
(入力例2をそのままioにコピーしただけ。)
手順として、
1:Nを標準入力で取り込む
2:約数の個数を格納する変数countを0で初期化する
3:ループでi=1からNまでの範囲で、N%i==0と割り切れた場合にcountをインクリメントする
4:countを出力する
で、行います。
では、ループのトレースのコードの出力結果を掲載します。
i=1の時
N=100をi=1で割ると割り切れるので約数が見つかりました。
countをインクリメントします。
i=2の時
N=100をi=2で割ると割り切れるので約数が見つかりました。
countをインクリメントします。
i=3の時
N=100をi=3で割っても割り切れないのでIF文を飛ばします。
i=4の時
N=100をi=4で割ると割り切れるので約数が見つかりました。
countをインクリメントします。
i=5の時
N=100をi=5で割ると割り切れるので約数が見つかりました。
countをインクリメントします。
以下省略して、割り切れる所を含む部分をトレースします。
i=10〜15の時
N=100をi=10で割ると割り切れるので約数が見つかりました。
countをインクリメントします。
i=11〜15まで割れません。
i=20〜26の時
N=100をi=20で割ると割り切れるので約数が見つかりました。
countをインクリメントします。
i=21〜24まで割れません。
N=100をi=25で割ると割り切れるので約数が見つかりました。
countをインクリメントします。
i=26は割れません。
i=50〜56の時
N=100をi=50で割ると割り切れるので約数が見つかりました。
countをインクリメントします。
I=51〜56まで割れません。
i=95〜100の時
N=100をi=95〜99まで割っても割れません。
N=100をi=100で割ると割り切れるので約数が見つかりました。
countをインクリメントします。
約数の個数が9個になってループを抜けました。
ループを抜けた後、約数を出力しています。
ここまでのトレースのコードです。
#Nを標準入力で取り込む
N=int(input())
#約数の個数を格納する変数countを0で初期化する
count=0
#ループでi=1からNまでの範囲で、N%i==0と割り切れた場合にcountをインクリメントする
print('<<<ループに入ります。>>>')
for i in range(1,N+1):
print('除算前のcount:「'+str(count)+'」')
print('N='+str(N)+'を「i='+str(i)+'」で割ります。')
if N%i==0:
print('i='+str(i)+'で割り切れたので約数みっけ(=^x^=)')
count+=1
print('count:【'+str(count)+'】')
print('------------------------------------')
print('<<<ループを抜けました。>>>')
#countを出力する
print(count)
ループのrange(1,N+1)となっているのは、引数の最後のところがN+1未満、すなわちNまでの範囲が適用されるからです。
このままでは、出力結果である出力例2に対して冗長なコードが含まれているので、解答以外のprint文をコメントアウトします。
#Nを標準入力で取り込む
N=int(input())
#約数の個数を格納する変数countを0で初期化する
count=0
#ループでi=1からNまでの範囲で、N%i==0と割り切れた場合にcountをインクリメントする
#print('<<<ループに入ります。>>>')
for i in range(1,N+1):
#print('除算前のcount:「'+str(count)+'」')
#print('N='+str(N)+'を「i='+str(i)+'」で割ります。')
if N%i==0:
#print('i='+str(i)+'で割り切れたので約数みっけ(=^x^=)')
count+=1
#print('count:【'+str(count)+'】')
#print('------------------------------------')
#print('<<<ループを抜けました。>>>')
#countを出力する
print(count)
スッキリするように、コメントアウトした部分を省いたコードです。
#Nを標準入力で取り込む
N=int(input())
#約数の個数を格納する変数countを0で初期化する
count=0
#ループでi=1からNまでの範囲で、N%i==0と割り切れた場合にcountをインクリメントする
for i in range(1,N+1):
if N%i==0:
count+=1
#countを出力する
print(count)
ioの出力結果です。
■ GASでの解き方 ■
では、同じ問題をGASで解いてみます。
まず、スプレッドシートにこの様に配置しました。
スプレッドシートの緑のセルに約数の個数を求める整数N:100を入力しました。
黄色いセルには配列の中にあるNの約数の個数を出力します。
※スプレッドシートに表示する場合は、二次元配列としてからの配列に追加をして作成します※
手順はこのようになります。
1:スプレッドシートからアクティブシートにアクセスする
2:スプレッドシートの緑のセルから整数N(この例の場合は100)を取得する
3:整数Nが取得出来たことをログで確認する
4:約数の個数countを0で初期化する
5:ループ内でIF文を使ってN=100の約数を見つけたらcountをインクリメントする
6:ループを抜けてcountをログで出力する
7:二次元配列としてcountを出力する配列count2を宣言する
8:count2に二次元配列になるようにcountを追加する
9:スプレッドシートに出力する前にcount2をログで確認する
10:スプレッドシートの黄色い所にcount2を出力する
手順1: スプレッドシートからアクティブシートにアクセスする
const ss=SpreadsheetApp.getActiveSheet();
ここで定数ssにSpreadsheetAppから階層を辿ってアクティブシートにアクセスしています。
手順2:スプレッドシートの緑のセルから整数N(この例の場合は100)を取得する
const N=ss.getRange(1,2).getValue();
手順3:整数Nが取得出来たことをログで確認する
console.log(N);
手順4:約数の個数countを0で初期化する
let count=0;
手順5:ループ内でIF文を使ってN=100の約数を見つけたらcountをインクリメントする
i=1の時
N=100をi=1で割ると割り切れるので約数が見つかりました。
countをインクリメントします。
i=2の時
N=100をi=2で割ると割り切れるので約数が見つかりました。
countをインクリメントします。
i=3の時
N=100をi=3で割っても割り切れないのでIF文を飛ばします。
i=4の時
N=100をi=4で割ると割り切れるので約数が見つかりました。
countをインクリメントします。
i=5の時
N=100をi=5で割ると割り切れるので約数が見つかりました。
countをインクリメントします。
以下省略して、割り切れる所を含む部分をトレースします。
i=10〜15の時
N=100をi=10で割ると割り切れるので約数が見つかりました。
countをインクリメントします。
i=20〜24の時
N=100をi=20で割ると割り切れるので約数が見つかりました。
countをインクリメントします。
i=21〜24まで割れません。
i=25〜30の時
N=100をi=25で割ると割り切れるので約数が見つかりました。
countをインクリメントします。
i=26〜30まで割れません。
i=48〜53の時
i=48,49まで割れません。
N=100をi=50で割ると割り切れるので約数が見つかりました。
countをインクリメントします。
i=51〜53まで割れません。
i=96〜100の時
N=100をi=96〜99まで割っても割れません。
N=100をi=100で割ると割り切れるので約数が見つかりました。
countをインクリメントします。
約数の個数が9個になってループを抜けました。
ここまでのトレースのループ部分のコードです。
//ループ内でIF文を使ってN=100の約数を見つけたらcountをインクリメントする
console.log('<<<ループに入ります。>>>');
for(let i=1;i<=N;i++){
console.log(`現在のcount:【${count}】`);
console.log(`N=${N}を「i=${i}」で割る`);
if(N%i==0){
console.log(`約数みっけ(=^x^=) i:「${i}」はN:${N}の約数です。`);
count++;
console.log(`約数count:【${count}】個目です。`);
}
console.log('--------------------------------------------');
}
console.log('<<<ループを抜けました。>>>');
手順6:ループを抜けてcountを出力する
console.log(count);
手順7:二次元配列としてcountを出力する配列count2を宣言する
let count2=[];
手順8:count2に二次元配列になるようにcountを追加する
count2.push([count]);
手順9:スプレッドシートに出力する前にcount2をログで確認する
console.log(count2);
手順10:スプレッドシートの黄色い所にcount2を出力する
ss.getRange(3,2).setValue(count2);
実行後のスプレッドシートです。
GASでの全コードはこちらになります。
function loop2no19(){
//スプレッドシートからアクティブシートにアクセスする
const ss=SpreadsheetApp.getActiveSheet();
//スプレッドシートの緑のセルから整数N(この例の場合は100)を取得する
const N=ss.getRange(1,2).getValue();
//整数Nが取得出来たことをログで確認する
console.log(N);
//約数の個数countを0で初期化する
let count=0;
//ループ内でIF文を使ってN=100の約数を見つけたらcountをインクリメントする
console.log('<<<ループに入ります。>>>');
for(let i=1;i<=N;i++){
console.log(`現在のcount:【${count}】`);
console.log(`N=${N}を「i=${i}」で割る`);
if(N%i==0){
console.log(`約数みっけ(=^x^=) i:「${i}」はN:${N}の約数です。`);
count++;
console.log(`約数count:【${count}】個目です。`);
}
console.log('--------------------------------------------');
}
console.log('<<<ループを抜けました。>>>');
//ループを抜けてcountを出力する
console.log(count);
//二次元配列としてcountを出力する配列count2を宣言する
let count2=[];
//count2に二次元配列になるようにcountを追加する
count2.push([count]);
//スプレッドシートに出力する前にcount2をログで確認する
console.log(count2);
//スプレッドシートの黄色い所にcount2を出力する
ss.getRange(3,2).setValue(count2);
}
宜しかったらコピペしてアレンジして見て下さい。
お疲れ様でした、ブレイクタイムフォトはこちらになります。
大井競馬場メガイルミ
■ 参考文献の紹介■
じっくり丁寧にPythonを学びたい方向け。
まずはpaizaラーニングなどの学習コンテンツで学んで、基礎をマスターしたら、この本でじっくりと初級から中級レベルを目指せます。
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。
GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本でじっくり学べます。
paizaレベルアップ問題集でPythonとGASを解いて見たに戻る
メインメニューに戻る
Python自作サンプル
GASサンプル
基本情報技術者試験
プログラミングのアンケートにご協力頂ける方はこちらのフォームで勉強法など色々と教えて下さい。