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

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

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

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

Q&A

解決済

2回答

14589閲覧

nが平方数かどうか調べる時

nyan_para

総合スコア11

Python

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

0グッド

0クリップ

投稿2019/07/12 04:39

質問内容

正の整数nが平方数かどうか調べたい時
range()を使って調べる範囲を今は(1)のようにnの半分くらいまでに
しているのですが、
調べる範囲は当然nの平方根+1くらいまでで良い筈です。
でもそうすると記述が複雑になると考えて、結局nの半分くらいまでにしているのですが、
皆さんはどの範囲までにしていますか?
その理由を(良ければ記述法も)教えて下さい。

参考になるサイトがある場合はそれを教えて下さればそれを読んで学習します。
初めての質問なので、記述に不明点があればご指摘ください。

(1)今の書き方

Python

1if any(i**2 == n for i in range(n//2)):

(2)補足

個人的には調べる範囲が

  1. nのサイズによる
  2. nがどの数字であっても一つに収まる

で、2.であるならばその範囲を採択したいなと考えています。

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

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

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

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

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

guest

回答2

0

ベストアンサー

平方根が整数かどうか調べれば良いのだけなのでは。

Python

1>>> for n in range(1, 100): 2... if (n ** .5).is_integer(): 3... print(n) 4... 51 64 79 816 925 1036 1149 1264 1381

あるいは平方根がfloatに収まらないようなケースについての質問でしょうか?

投稿2019/07/12 04:42

編集2019/07/12 04:43
LouiS0616

総合スコア35660

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

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

nyan_para

2019/07/12 04:56

回答頂きありがとうございます。平方根がfloatに収まらないケースは特に想定していませんでした。
nyan_para

2019/07/12 05:04

やってみて 完全理解マンになりました(それは嘘) ありがとうございます。
nyan_para

2019/07/12 05:18

ご丁寧にありがとうございます! 今後平方数かどうか調べる時は安心して教わった方法を活用します。
guest

0

python3

1def is_square_num(n): 2 i2 = 0 3 for i in range(0, n + 1): 4 if i2 == n: 5 return True 6 if i2 > n: 7 return False 8 i2 += i * 2 + 1 9 10print([x for x in range(-2, 101) if is_square_num(x)])

質問は平方根の計算をせずに 平方数かを判定したいのだと、私は理解しました。

質問文のコードでは 1.. から x // 2 の平方数を列挙し、その中に x と一致するものがあるかを調べています。

上のコードでは、2 * n + 1 を累積していくと 平方数になることを利用して平方数をループしながら生成していきます。
平方数が x よりおおきくなったら return False します。
生成した平方数と x が一致すれば return True します。
生成する平方数の個数は x の平方根 + 1 個程度でおさえられます。
(上のコードでは 0 も平方数と判定するようにしています)

投稿2019/07/13 05:30

katoy

総合スコア22324

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

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

nyan_para

2019/07/13 11:09

回答頂きありがとうございます。 質問した時点ではどうやったら平方数かどうか出せるかの手段を知らなかったため、 自分の知っているやり方で調べる範囲を狭める方法を質問しました。 その点で言うと、katoyさんのお教えくださった方法だと 生成する個数はxの平方根+1程度で出せるということが分かり大変ありがたいです。 2n+1の累積が平方数になる事も自分にとって勉強になりました。 (下記のリンクでその理屈は学んでみました) http://www.mm-labo.com/science/mathematics/quiz/euclid3(ans).html このやり方を知っておくと他の言語でも使用できそうなのでありがたいです。
katoy

2019/07/13 12:22

https://ja.wikipedia.org/wiki/%E5%B9%B3%E6%96%B9%E6%95%B0 にある図をイメージすれば、 正方形を 2 * n + 1 の和に分割できることをすぐに思い出せます。 2 * n を n + n で計算することにすれば、 足し算だけで処理ができることになります。 (掛け算、ましてや 平方根の計算も不要) http://www.rvf-rc45.net/wordpress/?p=1917 にあるような方法で整数演算だけで平方根を求めてしまうという手もあります。
nyan_para

2019/07/13 13:55

リンクを貼ってくださってありがとうございます。 上のWikipediaの説明にある図は分かりやすいし、 今後は思い出すのに役立ちそうです。 下の整数演算のみでやるやり方は自力で知ることは無かったと思います。 平方数を足し算のみで処理というと意外な感じがしますが、 基礎に立ち返るとなるほどそうだなと感じます。 初心者の質問にも丁寧に答えて下さりありがとうございます。 勉強頑張ります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問