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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

627閲覧

Atcoder、Pythonにコードの間違い指摘への助言

sakura.k

総合スコア50

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/08/02 14:05

前提

Atcoderの以下の問題にて、コードを書いたのですが、一部のテストケースにおいて期待した出力が得られませんでした。コードを見ていただき、問題点を教えていただきたいです。

実現したいこと

以下の問題において、期待する出力を出すようなコードを書くこと。
https://atcoder.jp/contests/typical90/tasks/typical90_bo

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

入力に対する出力が異なる。

該当のソースコード

python

1n,k = list(map(int,input().split())) 2 3def base10int(value, base): 4 if (int(value / base)): 5 return base10int(int(value / base), base) + str(value % base) 6 return str(value % base) 7 8#8進法を9進法に直し、ここに現れる数字「8」を「5」に書き直す。 9for j in range(k): 10 #8進数を10進数に変換 11 num10=int(str(n), 8) 12 #10進数を9進数に変換 13 num9=base10int(num10, 9) 14 #ここに現れる数字「8」を「5」に書き直す。 15 str_num9=str(num9) 16 lst=list(str_num9) 17 18 count=0 19 for i in lst: 20 if int(i)==8: 21 lst[count]="5" 22 count+=1 23 24 count=0 25 26 new_String="".join(lst) 27 n=int(new_String) 28 29print(n)

試したこと

実際にコードを書きました。

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

なし

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

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

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

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

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

y_waiwai

2022/08/03 04:20

質問は編集できます 無駄に質問建てないで追記修正しましょう
1T2R3M4

2022/08/03 04:27

デバッグした内容を質問に追記していただけませんか。
guest

回答3

0

ベストアンサー

Pythonでは演算子/での除算結果の値の型はfloatになります。
floatなので巨大な数値では丸め誤差が発生します。
代わりに2//1のように演算子//で計算すると結果は整数のままで誤差も発生しません。

投稿2022/08/03 06:28

can110

総合スコア38233

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

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

sakura.k

2022/08/03 07:11

なるほど。ありがとうございます。
guest

0

def base10intを
int2str9に書き換えました。
文字列の反転は、下記を参考にしています。
文字列の反転

n,k = list(map(int,input().split())) def int2str9(num): if num == 0: return "0" ans = "" while num != 0: ans = ans + str(num % 9) num = num // 9 return ans[::-1] #文字列を反転して返す #8進法を9進法に直し、ここに現れる数字「8」を「5」に書き直す。 for j in range(k): #8進数を10進数に変換 num10=int(str(n), 8) #10進数を9進数に変換 #num9=base10int(num10, 9) num9=int2str9(num10) #ここに現れる数字「8」を「5」に書き直す。 str_num9=str(num9) lst=list(str_num9) count=0 for i in lst: if int(i)==8: lst[count]="5" count+=1 count=0 new_String="".join(lst) n=int(new_String) print(n)

投稿2022/08/03 06:22

tatsu99

総合スコア5424

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

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

0

どうやら巨大な整数でint(value / base)を行うと誤差が出るようです。divmod関数を使ってみては
(Jupyter Notebookで確認)

python

1n = 77777777777777777777 2print("question :" + str(n)) 3num10=int(str(n), 8) 4print("base10 :" + str(num10)) 5s, a = divmod(num10, 9) 6print("div 9 :" + str(int(num10 / 9))) 7print("divmod 9 :" + str(s))
question :77777777777777777777 base10 :1152921504606846975 div 9 :128102389400760768 divmod 9 :128102389400760775

投稿2022/08/03 04:41

RiaFeed

総合スコア2701

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問