0
0

(D⇒C)大きな数値を 3 けたごとにカンマ区切りで出力(逆パターン)

Posted at

今日は前回の逆パターン
今日はPythonでこの問題
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_split_boss
・出力された数値を3桁ごとにカンマ区切りするというやつ
 ただし、今度は前からではなく後ろから区切る
・前回教えてもらったf-stringを使えば簡単にできる・・・が、絶対意図と違う
 (とりあえず示しておく)

N = int(input())
print(f"{N:,}")

・意図はループからカンマを付けていくやつだとおもう

たとえば
3546373 => 3,546,373 と変えるとしよう
この場合、3桁で桁数7を割ると1余る。
左から数えると1桁の次が必ずコンマがつく。

では左から3桁ずつコンマが付く場合とどう調整するか。
下の通りやれば、左からi番目で3桁になれば、i%3=0となりコンマがつくので
354,637,3、となる。

for i in range(len(N)):
   if i % 3 == 0 and i != 0:
       print(",", end="")

   print(N[i], end="")

これだと右からのとあわない。
では、どうするか。
下記をみると2桁ずつずらせばいいことがわかる。

3,546,373
354,637,3

とすると、iに、- 1を引いて割ればいいのではないか?
そうすると、
仮にi = 0だとすると、こちらはifが不成立なので、スルーして 3がprint
次にi = 1だとすると、こちらはifが成立して,がつき、次に5がprint
次にi = 2だとすると、こちらはifが不成立なので、スルーして、次に4がprint
次にi = 3だとすると、こちらはifが不成立なので、スルーして、次に6がprint
次にi = 4だとすると、こちらはifが成立して,がつき、次に3がprint
,
,
,
となって正しく出力される。

iとちがって、i-1だと違う結果になるのが不思議だ。
というわけで、あとは法式化すると。。。。
これでロジック化できた。

N = input()
x = len(N) % 3
for i in range(len(N)):
   if (i - x) % 3 == 0 and i != 0:
       print(",", end="")

   print(N[i], end="")

これは回答を見たのだが、どうしてもよくわからなかったので、
1つずつ実例を出して、1桁ずつやってみた。
そしたら理解できた。

前に数学で規則性というのがあったのだが、詳しいことは忘れたのだが、
これこれこういう現象があり、それをルール化したらどうなるか?と
いうのをやったことがある。
それとよく似ているなと思った。

となると、色々な数値を相手にロジックを探し出して行く作業が大事なんだろうなと思った。

0
0
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
0
0