1
2

なでしこ/プロデル でハーシャッド数判定

Posted at

はじめに

日本語のプログラミング言語になでしこプロデルがあります。共に、AtCoderで採用されており、それぞれの言語で解答を提出することができます。
今回、同じ問題を両者で解いてみた時、仕様の違いが興味深かったので紹介します。
やり方としては、まずPythonを用いて解答を作り、それをなでしこプロデルに翻訳するという形をとります。

問題

整数Xを十進法で表したときの各桁の数字の和をf(X)としたとき、Xがf(X)で割り切れる場合、Xはハーシャッド数です。
整数Nが与えられるので、ハーシャッド数かどうか判定してください。

python解答

X0=int(input())
M=0
X=X0
for i in range(len(list(str(X0)))):
  M+=X%10
  X=X//10
if X0%M==0:
  print('Yes')
else:
  print('No')

翻訳のポイント

数字を文字列として見た時の字数はいくらか

[python]
len(list(str(X0)))

[なでしこ]
Y0=X0を文字列変換
LはY0の文字数

[プロデル]
Lは[X0]の文字数。 ・・・・・・[]の用法が便利に使える

Xを、Xを10で割った時の商で置き換える

[python]
X=X//10

[なでしこ]
X=X/10の整数部分

[プロデル]
YはX/10を切り捨てたもの
X=Y ・・・・・・後からYをXに代入する

X0がMで割り切れるならば

[python]
if X0%M==0:

[なでしこ]
もしX0%M=0ならば

[プロデル] 
ANS=X0%M   ・・・・・・計算は先に済ませる
もしANSの整数が0ならば ・・・・・・整数指定が必要

これらのポイントに対応することでAC解答できます。

なでしこ解答

入力を尋ねて、X0に代入。
Y0=X0を文字列変換。
LはY0の文字数。
M=0
X=X0
i を 0 からLまで繰り返す。
  M=M+X%10
  X=X/10の整数部分。
ここまで。
もしX0%M=0ならば、"Yes"を表示。
違えば、"No"を表示。

プロデル解答

X0は、コンソールから受け取ったもの。
Lは[X0]の文字数。
M=0
X=X0
iを1から1ずつ増やしながらL+1まで繰り返す。
  M=M+X%10
  Yは、X/10を切り捨てたもの。
  X=Y
繰り返し終わり。
ANS=X0%M
もしANSの整数が0ならば、「Yes」を表示。
そうでなければ、「No」を表示。

終わりに

AtCorderの簡単な問題をいろいろな言語で解いています。言語間の違いを相互に知ることで、効率的に多言語並行学習を進めることが可能と考えています。皆様にもおすすめします。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2