Pythonに於ける整数の切り上げと切り捨てについて

投稿者: Anonymous

このサイトの方法で切り上げをして、AIZU ONLINEジャッジのこの問題を解いているのですが、「Wrong Answer」と出ます。どこに原因があるのでしょうか。
よろしければ、サイトに書かれてある関数の問題点とその改善案を上げてください。

# サイトの関数をmarume.ceilから、int_ceilに変更。
def int_ceil(src,range):
    return ((int)(src / range) + 1) * range

def main():
    week = int(input())
    debt = 100000
    risi = int_ceil(int(debt*0.05) * week,10000)
    ans = debt + risi
    print(ans)

if __name__ == "__main__":
    main()

解決

質問にあるint_ceilsrcrangeの倍数になっている場合、正しく切り上げができません。

 def int_ceil(src, range):
     return ((int)(src / range) + 1) * range

 print(int_ceil(900, 1000))  # 1000
 print(int_ceil(1000, 1000)) # 2000 (正しくは1000)
 print(int_ceil(1100, 1000)) # 2000

この質問のようにすると正しく動きます。

import math
def int_ceil(src, range):
    return int(math.ceil(src/float(range)) * range)

# 別の方法
def int_ceil(src, range):
    return src if src % range == 0 else src + range - src % range

さらに、質問のmain関数の処理を
・先週までの利子を加えた借金総額に対して利子が加わる
・1000円未満を切り上げる
という処理に訂正すると以下のようなプログラムになります。

import math
def int_ceil(src, range):
    return int(math.ceil(src/float(range)) * range)

def main():
    week = int(input())
    debt = 100000
    for _ in range(week):
        risi = debt * 0.05
        debt = int_ceil(debt + risi, 1000)
    print(debt)

if __name__ == "__main__":
    main()

このコードを提出するとAcceptされました。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *