paiza レベルアップ問題集 「STEP: 3 2 で何回割れる?」をPythonとGASで解いてみた

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

2 で何回割れる? (paizaランク D 相当)

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

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

投稿者: nekosiestr

プログラミング学習中のロスジェネ(就職氷河期世代)の発達障害者です。 宜しくお願いします。 趣味で写真を撮っています。 プログラミングは、GAS/HTML/CSS/JavaScript/jQuery/PHP、 発達障害は、自閉症スペクトラムASD/ADHD、その他双極性障害やHSP(5人に1人の繊細さん)などの生きづらさを抱えておりますが、それでも楽しく生きて行きたいです!! 写真は、以前はコンパクトデジカメ、現在は、OLYMPUSミラーレス一眼を使っています。