paiza レベルアップ問題集 「FINAL問題 約数の列挙」をPythonとGASで解いてみた

この記事を読むことで、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だったらどう解くのか、スプレッドシートでバインドして作ってみました。

約数の列挙 (paizaランク D 相当)

問題:
整数 N が与えられます。
N の約数を小さい方から順に改行区切りで出力してください。

この記事では、下記の入力例2の場合を例にして、標準入力でリストの要素数N=100を取得し、その約数を昇順に列挙して行きます。

入力例2
100

出力例2
1
2
4
5
10
20
25
50
100

ではまず、Pythonで解いてみます。
今回は、paiza.ioを使って解きます。paiza.ioの使い方はこちらから。

■ Pythonでの解き方 ■

下準備として、paiza.ioにこの様に入力します。
(入力例2をそのままioにコピーしただけ。)

手順として、

1:Nを標準入力で取り込む

2:ループでi=1からNまでの範囲でループ内でIF文を使って、N%i==0と割り切れた場合にiを出力する

で、行います。

コードはこちらになります。

#Nを標準入力で取り込む
N=int(input())

#ループでi=1からNまでの範囲でループ内でIF文を使って、N%i==0と割り切れた場合にiを出力する
for i in range(1,N+1):
    if N%i==0:
        print(i)

この問題の類題のトレースは、前回の記事で詳しく行なっておりますので、変数の動きを知りたい方は前回の記事をご覧下さい。

■ GASでの解き方 ■

では、同じ問題をGASで解いてみます。
まず、スプレッドシートにこの様に配置しました。

スプレッドシートの緑のセルに約数を列挙する整数N:100を入力しました。
黄色いセルには配列の中にあるNの約数の個数を出力します。

※スプレッドシートに表示する場合は、二次元配列としてからの配列に追加をして作成します※

手順はこのようになります。

1:スプレッドシートからアクティブシートにアクセスする

2:スプレッドシートの緑のセルから整数N(この例の場合は100)を取得する

3:整数Nが取得出来たことをログで確認する

4:約数をスプレッドシートに二次元配列として格納する配列divisorを宣言する

5:ループ内でIF文を使ってN=100の約数を見つけたら配列divisorに追加する

6:ループを抜けて、スプレッドシートに出力する前に配列divisorをログで出力する

7:スプレッドシートの黄色い所にdivisorを出力する

手順1: スプレッドシートからアクティブシートにアクセスする

const ss=SpreadsheetApp.getActiveSheet();

ここで定数ssにSpreadsheetAppから階層を辿ってアクティブシートにアクセスしています。

手順2:スプレッドシートの緑のセルから整数N(この例の場合は100)を取得する

const N=ss.getRange(1,2).getValue();

手順3:整数Nが取得出来たことをログで確認する

console.log(N);

手順4:約数をスプレッドシートに二次元配列として格納する配列divisorを宣言する

let divisor=[];

手順5:ループ内でIF文を使ってN=100の約数を見つけたら配列divisorに追加する

ループ内での約数を見つけた時の動きは、前回の記事で詳しく行なっておりますので、変数の動きを知りたい方は前回の記事をご覧下さい。

ループの部分のコードです。

//ループ内でIF文を使ってN=100の約数を見つけたら配列divisorに追加する
  for (let i=1;i<=N;i++){
    if(N%i==0){
      divisor.push([i]);
    }
  }

手順6:ループを抜けて、スプレッドシートに出力する前に配列divisorをログで出力する

console.log(divisor);

手順7:スプレッドシートの黄色い所にdivisorを出力する

ss.getRange(3,2,divisor.length).setValues(divisor);

実行後のスプレッドシートです。

GASでの全コードはこちらになります。

function loop2no20(){

  //スプレッドシートからアクティブシートにアクセスする
  const ss=SpreadsheetApp.getActiveSheet();

  //スプレッドシートの緑のセルから整数N(この例の場合は100)を取得する
  const N=ss.getRange(1,2).getValue();

  //整数Nが取得出来たことをログで確認する
  console.log(N);

  //約数をスプレッドシートに二次元配列として格納する配列divisorを宣言する
  let divisor=[];

  //ループ内でIF文を使ってN=100の約数を見つけたら配列divisorに追加する
  for (let i=1;i<=N;i++){
    if(N%i==0){
      divisor.push([i]);
    }
  }

  //ループを抜けて、スプレッドシートに出力する前に配列divisorをログで出力する
  console.log(divisor);

  //スプレッドシートの黄色い所にdivisorを出力する
  ss.getRange(3,2,divisor.length).setValues(divisor);

}

宜しかったらコピペしてアレンジして見て下さい。
お疲れ様でした、ブレイクタイムフォトはこちらになります。

東京ドームシティ、恋するイタリア

■ 参考文献の紹介■

じっくり丁寧にPythonを学びたい方向け。
まずはpaizaラーニングなどの学習コンテンツで学んで、基礎をマスターしたら、この本でじっくりと初級から中級レベルを目指せます。

初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。

GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本でじっくり学べます。

サイトマップはこちらから

paizaレベルアップ問題集でPythonとGASを解いて見たに戻る
メインメニューに戻る
Python自作サンプル
GASサンプル
基本情報技術者試験

プログラミングのアンケートにご協力頂ける方はこちらのフォームで勉強法など色々と教えて下さい。

←前の問題へ          

paiza レベルアップ問題集 「STEP: 14 約数の個数」をPythonとGASで解いてみた

この記事を読むことで、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だったらどう解くのか、スプレッドシートでバインドして作ってみました。

約数の個数 (paizaランク D 相当)

問題:
整数 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サンプル
基本情報技術者試験

プログラミングのアンケートにご協力頂ける方はこちらのフォームで勉強法など色々と教えて下さい。

←前の問題へ          次の問題へ→