質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.39%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

2回答

1342閲覧

各位の和を求めるプログラムを書きたい(文字列として扱ってはいけない)

siosai19

総合スコア1

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/06/06 11:18

実現したいこと

python3において、標準入力から整数を入力するとその整数の各位の和を求めるプログラムを書く。

前提

整数をxとする。
文字列として扱うのは禁止で、あくまで数式を処理して解を求める。
方針は思いついているため、この方針でプログラムを書きたいと思います。
1.xの桁数を取得する(ketaとする)(←lenが使えないので困っています。)
2.xを10の(keta-1)乗で割り、商を求める。(例;123//100==1)
3.xから(keta-1)(2で求めた数)を引き、それを10の(keta-2)乗で割り、商を求める。(例;(123-1001)//10==2)
4.(2,3)のプロセスを(keta)回繰り返す
5.(2、3)で出てきた答えを足し上げ、printする

発生している問題・エラーメッセージ

TypeError Traceback (most recent call last) <ipython-input-7-18a684c5b204> in <cell line: 3>() 1 #問題4-1 2 x=int(input("整数>")) ----> 3 keta=int(len(x)) 4 5 for i in range(1,keta): TypeError: object of type 'int' has no len()

該当のソースコード

python3

1 2x=int(input("整数>")) 3keta=int(len(x)) 4 5for i in range(1,keta): 6 y=x//(10**(keta-i)) 7 y+=(x-10**(keta-i)*y)//(10**(keta-i-1)) 8print(y) 9

疑問点

単純な繰り返し処理はできるのだが、今回のようにプロセス中で出てきた値を繰り返し処理にまた組み込む入れ子構造になっているとよく分からない。
繰り返しの切れ目をどこにすればいいのか分からない。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

整数の、各桁の数を取り出すには、商が0になるまで10で割って、そのときどきの余りをあつめればよいでしょう。大きな方からやらなくていいのです。

1234 / 10 = 123 ... 4
123 / 10 = 12 ... 3
12 / 10 = 1 ... 2
1 / 10 = 0 ... 1

ちなみに、何回割れたかで、桁数も出せます。

投稿2023/06/06 11:54

TakaiY

総合スコア13548

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

siosai19

2023/06/06 12:49

x=int(input("整数>")) q=x//10 p=x%10 sum=p while True: q=q//10 sum+=q%10 if q==0: break print(sum) ⇒1234を入力すると、出力は7
siosai19

2023/06/06 12:50

回答ありがとうございます。 いただいたヒントを元に直してみたらここまで来ました。 qの計算の中身が0になってしまい、答えが合いません。。。 あと少しヒントを頂きたいです!
TakaiY

2023/06/06 13:00 編集

ループの中で、10で割った後に余りを足しているからでしょう。 また、最初の処理をロープの外でやっているのも不要に複雑にしていると思います。
siosai19

2023/06/06 13:03

すみません、どうしてもわかりません。 どのようにかけばよいのでしょうか。
otn

2023/06/06 13:38

> すみません、どうしてもわかりません。 具体的に回答例の数字をqに当てはめながら、処理を追うと、回答の通りにやってないことがすぐわかると思います。
TakaiY

2023/06/06 14:59

7になってしまうのは、 4+2+1 になってしまうからで、ループに入った最初の1の位が抜けてしまうからです。 なぜぞうなるかというと、「10で割った後に余りを足しているから」です。1回目で q=123のとき、10で割ってから、1の位を取ってしまうから3が抜けます。 なので、 「10で割った後に余りを足して」ではなく、逆に「余りを足してから10で割る」ひつようがあるということです。
guest

0

x = int(input("整数>")) y = 0 while x > 0: #以下の処理を、xが0より大きい間繰り返す(x=0になったら、桁を全部消化したということ) y += x % 10 #10で割った余りを足す(一の位の数を足すということ。上からではなく下から) x = x // 10 #xを10で割り、その商をxに再代入 (xの桁を1つ減らすということ) print(y)

投稿2023/06/06 14:48

編集2023/06/06 15:15
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.39%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問