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

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

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

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

Q&A

3回答

2045閲覧

adjacent.txtに記録されている数について隣接する n 桁の積の最大値が最も大きくなるを求めなさい

samta

総合スコア2

Python

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

0グッド

0クリップ

投稿2020/08/03 08:09

編集2020/08/03 08:15
f = open("adjacent.txt","r",encoding = "utf-8") number = f.read() print(number) ans = 0 print(number[2]) tmp = int(number[0]) for j in range(10): tmp *= int(number[j]) print(tmp) ```### 前提・実現したいこと adjacent.txtに記録されている数について隣接する n 桁の積の最大値が最も大きくなるを求めたいのですがn桁になったとたんにわからなくなってしまいました。

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

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

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

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

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

meg_

2020/08/03 08:11

コードは「コードの挿入」で記入してください。
samta

2020/08/03 08:13

初めてこれを使ったのでいまいち使い方がわかりませんでした。 申し訳ありません
meg_

2020/08/03 08:15

adjacent.txtの内容が分からないので答えようがないかと思います。データのサンプルも掲載ください。
samta

2020/08/03 08:21

7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450 こちらがデータのサンプルです。
tiitoi

2020/08/03 08:23

全部一桁ずつの数値として解釈していいのでしょうか?
samta

2020/08/03 08:25

はい。そうです。わかりずらくてすいません。
aokikenichi

2020/08/03 08:46

0以外の連続のn桁の数字を1桁ずつを別の数字として掛け合わせて最大値を求める でよいのでしょうか?
can110

2020/08/03 08:51

たとえばnumber='123456789', n=3の時の答えを記載ください。
samta

2020/08/03 09:00

aokikenichiさんそうです。
guest

回答3

0

こんなようなことでしょうか

Python

1 2max_out = 0 3tmp_out = 1 4for i in range(len(number)): 5 if number[i] != "0": 6 tmp_out *= int(number[i]) 7 else: 8 if tmp_out > max_out: 9 max_out = tmp_out 10 tmp_out = 1 11 12print(max_out)
2412446685431734624320887406251212800000000

投稿2020/08/03 08:53

aokikenichi

総合スコア2240

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

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

samta

2020/08/03 09:20

5行目に invalid literal for int() with base 10: '\n'とエラーが出てきてしまいます
guest

0

python

1with open("adjacent.txt", "r", encoding="utf-8") as f: 2 number = f.read().replace("\n", "") 3 4# 何個積をとるか 5n = 3 6# 0が何個あるか 7zero_number = 0 8# 0以外の積 9non_zero_mul = 1 10 11assert(len(number) >= n) 12 13# 最初のn個をかけておく 14for i in range(n): 15 if(number[i] == '0'): 16 zero_number += 1 17 else: 18 non_zero_mul *= int(number[i]) 19 20# 結果 21res = 0 if zero_number > 0 else non_zero_mul 22 23# 1つずつかける場所をずらしながら、最大値を探っていく 24for i in range(0, len(number)-n): 25 # 左端を除外(割るか, 0の数を減らす) 26 if(number[i] == '0'): 27 zero_number -= 1 28 else: 29 non_zero_mul = int(non_zero_mul/int(number[i])) 30 31 # 右端を入れる(かけるか, 0の数を増やす) 32 if(number[i+n] == '0'): 33 zero_number += 1 34 else: 35 non_zero_mul *= int(number[i+n]) 36 37 if(zero_number > 0): 38 now = 0 39 else: 40 now = non_zero_mul 41 42 res = max(res, now) 43print(res)

text

1648

投稿2020/08/03 19:32

Penpen7

総合スコア698

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

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

0

pandas を使うのであれば、以下のようにできます。
大きさ n の窓を動かしながら、その対象の範囲で総乗をとって、最後に一番大きい値を取得すればよいです。

python

1import pandas as pd 2 3with open("sample.txt") as f: 4 text = f.read().replace("\n", "").replace(" ", "") 5 6n = 3 7s = pd.Series(map(int, text)) 8max_val = s.rolling(n).apply(lambda x: x.prod()).max() 9print(max_val) # 648.0

例えば、7316717653 で窓の大きさを n = 3 としたとき、各位置での対象の値とその総乗は以下になります。

[7.0, 3.0, 1.0] -> 21
[3.0, 1.0, 6.0] -> 18
[1.0, 6.0, 7.0] -> 42
[6.0, 7.0, 1.0] -> 42
[7.0, 1.0, 7.0] -> 49
[1.0, 7.0, 6.0] -> 42
[7.0, 6.0, 5.0] -> 210
[6.0, 5.0, 3.0] -> 90

これの最大値をとると、210とわかります。

投稿2020/08/03 13:47

編集2020/08/03 13:51
tiitoi

総合スコア21956

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問