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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Q&A

解決済

4回答

281閲覧

Python3  ある整数を一定の割合ずつ減額する 繰り返し処理 while

python3_beginer

総合スコア46

Python 3.x

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

0グッド

1クリップ

投稿2018/04/17 09:55

目標)

筋トレメニュー作成アプリをつくりたい。

ベンチプレスを何回あげるかを自動で決めてくれる機能が欲しい。

1回目はX回あげる、二回目以降は前回の挙げた回数のP%下げる。
毎回の値下げにおいて小数点以下切り捨て

つまい、

2回目はX回から、P%を引いた回数にする

3回目は、2回目の回数から、P%を引いた回数にする

それ以降は、この繰り返し

挙げる回数がゼロになるまで続ける地獄のメニュー

最後に、ベンチプレスを挙げた総数を求めたい。

入力される値
入力は以下のフォーマットで与えられます。

X P
・一回目のベンチプレスを挙げる回数が整数 X と
割引き率を示す整数 P が、この順に半角スペース区切りで与えられます。
・入力は 1 行となり、末尾に改行が 1 つ入ります。

私のコード)

小数点以下切り捨てなので、挙げる回数が整数の1以下のときが、繰り返し処理の終点と認識

つまり、前回の回数×P%が1より小さい時に、条件が一致すると考えた

その結果以下のコードになりました。

手厳しい意見も含めて、皆さまの私のコードをみたご意見を頂戴したいです。

宜しくお願い致します。

コード import math data = list(map(int,input().split())) price, discount_rate = data[0],data[1] next_price = price - (price*discount_rate/100) next_price = math.floor(next_price) total_pay = [price, next_price] while (next_price*discount_rate/100) >= 1: next_price = next_price - (next_price*discount_rate/100) next_price = math.floor(next_price) total_pay.append(next_price) print(sum(total_pay))

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

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

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

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

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

hayataka2049

2018/04/17 09:59 編集

P%は最初の回数に対してですか? それとも一回前の回数に対して? あと、出力フォーマットはどんな形を想定しているのでしょうか。ぜんぶ足して出すだけ?
hayataka2049

2018/04/17 10:19

どっちも質問文よく読み返したら書いてありました、失礼しました
guest

回答4

0

質問のコード、ループの条件ミスってませんか? total_payが1まで行く前に終了しています。
たぶんこんな条件にしないと。

python

1(math.floor(next_price - next_price*discount_rate/100)) >= 1

それはそれとして

私が書いたらこうなったという例を貼っておきます。

python

1import math 2 3init_n, rate_n = [int(x) for x in input().split()] 4r = 1 - rate_n/100 5 6lst = [init_n] 7 8while lst[-1] >= 1: 9 lst.append(math.floor(r*lst[-1])) 10 11lst.pop(-1) 12print(sum(lst))

投稿2018/04/17 10:15

hayataka2049

総合スコア30933

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

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

python3_beginer

2018/04/18 12:56

お返事ありがとうございます。 スマートで分かりやすいですね。勉強になりました。 whileの条件の部分は自分では出てこない発想でとても面白かったです。 ご指導ありがとうございました。
guest

0

こんな感じでしょうか。

Python

1x, p = map(int, input().split()) 2p = (100 - p) / 100 3 4total = 0 5while x != 0: 6 total += x 7 x = int(x * p) 8 9print(total)

参考

問題の誤認から誕生した、『総セット数』を出力するコード。

Python

1from itertools import count 2 3x, p = map(int, input().split()) 4p = (100 - p) / 100 5 6for i in count(): 7 if x == 0: 8 break 9 10 x = int(x * p) 11 12print(i)

投稿2018/04/17 10:10

編集2018/04/17 10:25
LouiS0616

総合スコア35660

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

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

LouiS0616

2018/04/17 10:19

あ、問題設定を読み誤っていた... 筋トレの総セット数を出力するコードにしてしまいました。 修正しようかと思いましたが、hayataka2049さんのコードとほぼ同一になるのでやめておきます。
LouiS0616

2018/04/17 10:23

さらに訂正。 別のアプローチがあったのでそれに関する回答にしてみました。
python3_beginer

2018/04/18 12:57

お返事ありがとうございます。 スマートで分かりやすいですね。勉強になりました。 すごく簡単にもとまっていてさすがですね ご指導ありがとうございました。
guest

0

ベストアンサー

python3の整数商がfloorであることを利用してみた。

python

1price, discount = [int(x) for x in input().split()] 2 3f = lambda x, d: x * d // 100 4 5ans = price 6while price > 0: 7 price = f(price, 100-discount) 8 ans += price 9 10print(ans)

投稿2018/04/17 11:10

mkgrei

総合スコア8560

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

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

python3_beginer

2018/04/18 12:55

お返事ありがとうございます。 スマートで分かりやすいですね。勉強になりました。 ご指導ありがとうございました。
python3_beginer

2018/04/18 12:57

f = lambda x, d: x * d // 100 上記の式は初めてみました!以後使えるようにしたいです。
guest

0

素直に書くとこんな感じかなあ。

Python

1import math 2price, discount_rate = 10, 1 3discount_rate = float(discount_rate/100) # 12% -> 0.12 4total = 0 5while price >= 1: 6 total += price 7 price = math.floor( price *( 1 - discount_rate)) 8print(total) # 55

投稿2018/04/17 10:27

can110

総合スコア38266

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

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

python3_beginer

2018/04/18 12:55

お返事ありがとうございます。 スマートで分かりやすいですね。勉強になりました。 ご指導ありがとうございました。
can110

2018/04/18 13:01

回答に記載していませんでしたが、まずは「price - (price*discount_rate/100)」というほぼ同じ処理が複数の場所にあるのをまとめたいなあと私は感じました。 で、他の方も同じ感じを抱いたので結果として皆ほぼ同じ回答コードになったかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問