この記事を読むことで、Python・GASで整数を標準入力で文字列として取得し、その長さを求め、ループで整数の変換しながら合計を求める方法で、特にループの所で変数の動きが分かりやすいようにトレースをしています。
整数の桁数を求める方法や、文字列を数値に変換する方法について、Python・GASの両方のコードで詳しく書いています。
以上がPythonとGASの両方のコードで習得することが可能になります。
最初にPython、次にGASのコードを掲載します。
このコーナーでは、学習コンテンツpaizaラーニングのレベルアップ問題集をPythonとGASの両方で解いて全コードの解説をしています。
PythonとGASの両方のコードを用いて、全コード及び部分的にも可能な限り詳細に記載いたしました。
GASはスプレッドシートを使っています。
GASはGoogle Apps Scriptと言って、JavaScriptの文法をベースにしているので、JavaScriptの学習中の方にもお役立て出来るかも知れません。
paizaレベルアップ問題集でPythonとGASを解いて見たに戻る
メインメニューに戻る
Python自作サンプル
GASサンプル
基本情報技術者試験
paizaでの解答はPythonで行いましたが、この記事ではPythonのコードと共に、同じ問題を現在学習中のGASだったらどう解くのか、スプレッドシートでバインドして作ってみました。
問題:
10 進数で表された整数 N が与えられます。
整数 N の各桁の和を計算し、出力してください。
この記事では、下記の入力例3の場合に整数をNとして「813」が与えられ、その各桁の和・8+1+3=12を求めるプログラミングの問題を解いて行きます。
入力例3
813
出力例3
12
ではまず、Pythonで解いてみます。
今回は、paiza.ioを使って解きます。paiza.ioの使い方はこちらから。
■ Pythonでの解き方 ■
下準備として、paiza.ioにこの様に入力します。
(入力例3をそのままioにコピーしただけ。)
手順として、
1:標準入力で数値Nを「文字列として」取得
2:数値Nの桁数を求める
3:合計値ansを0で初期化
4:ForループとIFで格桁ごとに数値に変換して合計を求める
5:その合計を出力
で、行います。
まずは、プログラムの動きを見やすいように、トレースのコードとトレースのio出力結果を添えます。
#数値Nを文字列として取得
N=input()
#Nの桁数(文字列の長さ)を求める
length=len(N)
#合計結果ansを0で初期化
ans=0
#この文字列をリストとして、各桁を数値に変換して足していく
for i in range(length):
print('現在の合計値ans:【'+str(ans)+'】')
num=int(N[i])#ここで数値に変換している
print(str(i+1)+'桁目の数は「'+str(num)+'」です。')
print('現在の合計値ansに「'+str(num)+'」を加えます')
ans+=num#合計値を加算演算子で計算
print('計算後のans:【'+str(ans)+'】')
print('------------------------')
#合計値を出力する
print(ans)
トレースコードのログです。
このままでは、出力例3の合計値ans:12に対して冗長なコードが含まれているので、解答以外のprint文をコメントアウトします。
#数値Nを文字列として取得
N=input()
#Nの桁数(文字列の長さ)を求める
length=len(N)
#合計結果ansを0で初期化
ans=0
#この文字列をリストとして、各桁を数値に変換して足していく
for i in range(length):
#print('現在の合計値ans:【'+str(ans)+'】')
num=int(N[i])#ここで数値に変換している
#print(str(i+1)+'桁目の数は「'+str(num)+'」です。')
#print('現在の合計値ansに「'+str(num)+'」を加えます')
ans+=num#合計値を加算演算子で計算
#print('計算後のans:【'+str(ans)+'】')
#print('------------------------')
#合計値を出力する
print(ans)
スッキリするように、コメントアウトした部分を省いたコードです。
#数値Nを文字列として取得
N=input()
#Nの桁数(文字列の長さ)を求める
length=len(N)
#合計結果ansを0で初期化
ans=0
#この文字列をリストとして、各桁を数値に変換して足していく
for i in range(length):
num=int(N[i])#ここで数値に変換している
ans+=num#合計値を加算演算子で計算
#合計値を出力する
print(ans)
ioの出力結果です。
■ GASでの解き方 ■
では、同じ問題をGASで解いてみます。
まず、スプレッドシートにこの様に配置しました。
緑のセルに整数が入力されています。
黄色いセルの所に「各桁の合計値」を出力します。
※スプレッドシートに表示する場合は、ループを使って一次元配列ではなく、二次元配列としてからの配列に追加をして作成します※
手順はこのようになります。
1:スプレッドシートからアクティブシートをアクセスする
2:スプレッドシートの緑色のセルから整数N(この例では「813」)を取得する
3:整数Nが取得できたことをログで確認
4:変数Lenに、整数Nの桁数を取得して代入する
5:桁数Lenが取得できたことをログで確認する
6:合計値として計算に使用する変数ansを0で初期化する
7:ForループとIF文でsliceメソッドを使って数字列Nから各桁を切り出して、数値に変換してansに加算演算子で加算する
8:ansの合計結果をログ出力で確認
9:スプレッドシードに2次元配列として出力するans2を宣言
10:ansをans2にpushメソッドで追加する
11:スプレッドシート出力前に二次元配列ans2のログ出力で確認する
12:スプレッドシートの黄色いセルに格桁の合計が格納された二次元配列ans2を出力する
手順1: スプレッドシートからアクティブシートをアクセスする
const ss=SpreadsheetApp.getActiveSheet();
ここで定数ssにSpreadsheetAppから階層を辿ってアクティブシートにアクセスしています。
手順2: スプレッドシートの緑色のセルから整数N(この例では「813」)を取得する
const N = ss.getRange(1, 2).getValues();
手順3:ログで整数Nが取得できたことをログで確認
console.log(N);
手順4:整数Nの桁数を取得して、変数Lenに代入する
const Len = N.toString().length;
toStringは、整数Nの桁数を調べる為に一旦文字列にしてからlengthを使って桁数を調べます。
これはSAMURAI ENGINEERさんのtoStringメソッドの使い方の記事が分かりやすいです。
手順5:桁数Lenが取得できたことをログで確認する
console.log(`この数字列の桁数は、【${Len}】桁です。`);
文字列と数値を一緒に表示させるには、Shiftキーと@を押して「`」で囲って、${}のなかに数値を入れます。
手順6:合計値として計算に使用する変数ansを0で初期化する
let ans = 0;
計算の合計に使う値に何か入っていると正確な計算が出来ないので、必ず0で初期化します。
手順7:ForループとIF文でsliceメソッドを使って数字列Nから各桁を切り出して、数値に変換してansに加算演算子で加算する。
sliceメソッドで文字列を切り出す場合、この場合は
let num = N.toString().slice(i, i + 1);
と書いています。
slice(開始位置,終了位置の手前)
になるので、終了位置に+1としています。
この説明も、SAMURAI ENGINEERさんの文字列の任意の範囲を切り抜く方法の記事が分かりやすいです。
切り取った文字を数値に変換させています。
num=Number(num);
今回は、iを0からLen(長さ3)未満の範囲、つまりi=0,1,2でループを回しましたので、そのトレースを行います。
i=0の時
let num = N.toString().slice(0,1);
で、numに0番目の文字「8」が入り、合計が【8】になりました。
i=1の時
let num = N.toString().slice(1,2);
で、numに1番目の文字「1」が入り、合計が【9】になりました。
i=2の時
let num = N.toString().slice(2,3);
で、numに2番目の文字「3」が入り、合計が【12】になりました。
では、ループの部分とその前後のコードです。
//ForループとIF文でsliceメソッドを使って数字列Nから各桁を切り出して、数値に変換してansに加算演算子で加算する
console.log('<<<ループに入ります!!>>>');
for (let i = 0; i < Len; i++) {
let num = N.toString().slice(i, i + 1);
console.log(`現在の合計値ans:【${ans}】`);
num=Number(num);
console.log(`文字列「${i}」番目は「${num}」です。`);
ans += num; //ここで加算演算子を使ってansに加えている
console.log(`「${num}」を加えた合計ansは【${ans}】になりました`);
console.log('---------------------------------');
}
console.log('<<<ループを抜けました。>>>');
手順8:ansの合計結果をログ出力で確認
console.log(ans);
手順9:スプレッドシードに2次元配列として出力するans2を宣言
ans2=[];
手順10:ansをans2にpushメソッドで追加する
ans2.push([ans]);
手順11:スプレッドシート出力前に二次元配列ans2のログ出力で確認する
console.log(ans2);
手順12:スプレッドシートの黄色いセルに格桁の合計が格納された二次元配列ans2を出力する
ss.getRange(3,2).setValue(ans2);
GASでの全コードはこちらになります。
function loop2no6() {
//スプレッドシートからアクティブシートをアクセスする
const ss = SpreadsheetApp.getActiveSheet();
//スプレッドシートの緑色のセルから整数N(この例では「813」)を取得する
const N = ss.getRange(1, 2).getValues();
//整数Nが取得できたことをログで確認
console.log(N);
//変数Lenに、整数Nの桁数を取得して代入する
const Len = N.toString().length;
//桁数Lenが取得できたことをログで確認する
console.log(`この数字列の桁数は、【${Len}】桁です。`);
//合計値として計算に使用する変数ansを0で初期化する
let ans = 0;
//ForループとIF文でsliceメソッドを使って数字列Nから各桁を切り出して、数値に変換してansに加算演算子で加算する
console.log('<<<ループに入ります!!>>>');
for (let i = 0; i < Len; i++) {
let num = N.toString().slice(i, i + 1);
console.log(`現在の合計値ans:【${ans}】`);
num = Number(num);
console.log(`文字列「${i}」番目は「${num}」です。`);
ans += num; //ここで加算演算子を使ってansに加えている
console.log(`「${num}」を加えた合計ansは【${ans}】になりました`);
console.log('---------------------------------');
}
console.log('<<<ループを抜けました。>>>');
//ansの合計結果をログ出力で確認
console.log(ans);
//スプレッドシードに2次元配列として出力するans2を宣言
ans2 = [];
//ansをans2にpushメソッドで追加する
ans2.push([ans]);
//スプレッドシート出力前に二次元配列ans2のログ出力で確認する
console.log(ans2);
//スプレッドシートの黄色いセルに格桁の合計が格納された二次元配列ans2を出力する
ss.getRange(3, 2).setValue(ans2);
}
宜しかったらコピペしてアレンジして見て下さい。
お疲れ様でした、ブレイクタイムフォトはこちらになります。
石神井公園の桜。サイクルボートに乗って撮影しました。
■ 参考文献の紹介■
じっくり丁寧にPythonを学びたい方向け。
まずはpaizaラーニングなどの学習コンテンツで学んで、基礎をマスターしたら、この本でじっくりと初級から中級レベルを目指せます。
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。
GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本でじっくり学べます。
paizaレベルアップ問題集でPythonとGASを解いて見たに戻る
メインメニューに戻る
Python自作サンプル
GASサンプル
基本情報技術者試験