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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

4回答

5010閲覧

整数かどうかを真偽値で判定

kuraudo

総合スコア137

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

1グッド

1クリップ

投稿2018/03/13 00:21

目的、行いたい事

N(i) = 2017/i

と言う数式があったとき N(i) が整数のとき、その数を出力したいです。

試した事

すっごい雑ですが以下のような手順で出力できないか考えてみました。

num = 2017 num.times do |i| # (1)div_numに2017/(i+1)にあたる数を代入 # (2)boolにdiv_numが整数かどうか判定しその真偽値を代入 # (3)もし正だったらdiv_numを出力 if bool puts div_num end end

(1) div_numに2017/(i+1)にあたる数を代入

Rubyは割ると切り捨てされてしまうので以下のような書き方をしてココは乗り切りました。
div_num = num.quo(i+1).to_f
こうする事でちゃんと変数 div_num に小数点も含めた数を代入する事ができました。

問題点

(2),(3)のセットが分からないです。
正規表現のリファレンスを見ると =~ を使って何番目でマッチングするか(素人なので実際は違う可能性アリ)を判定してくれるモノでした。
なので =~ /^[0-9]+$/ を使おうとしてもイマイチ今回の場合に使い勝手が良いとは思いませんでした。

っと言うのも、 =~ /^[0-9]+$/ を使って数値かnilかどうかしか判定できないからです。

a = 2017.quo(i+1).to_f.to_s bool = (a =~ /^[0-9]+$/).nil?

またこんな風に書こうと思ったら以下の部分で詰みました。

9] pry(main)> a = 2017.quo(i+1).to_f.to_s => "672.3333333333334" [10] pry(main)> bool = (a =~ /^[0-9]+$/).nil? => true [11] pry(main)> i = 0 => 0 [12] pry(main)> a = 2017.quo(i+1).to_f.to_s => "2017.0" [13] pry(main)> bool = (a =~ /^[0-9]+$/).nil? => true

ここら辺までやったぐらいで
おそらく、もっと単純にできると思ったの皆さんの知恵をお借りしたいです(っω<。)フキフキ
お願い致します >人<

DrqYuto👍を押しています

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

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

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

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

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

guest

回答4

0

すでに解決済みですが・・・(投稿するのが遅れました)

与えられた数 num の約数の一覧を表示するなら

rb

1num = 2017 2 31.upto(num) do |i| 4 puts i if num.modulo(i).zero? 5end

とでも書けます。剰余を求めるメソッド Integer#modulo を使います。
if 修飾子の部分は

rb

1if num % i == 0

と書くこともできます。

--

余談

標準添付ライブラリー prime には整数を素因素分解するメソッドがあります。

rb

1require "prime" 2 3#以下のどちらの使い方も可 4 5# Prime.#prime_division 6p Prime.prime_division(40) # => [[2, 3], [5, 1]] 7p Prime.prime_division(2017) # => [[2017, 1]] 8 9# Integer#prime_division 10p 40.prime_division # => [[2, 3], [5, 1]] 11p 2017.prime_division # => [[2017, 1]]

結果の [[2, 3], [5, 1]] は 2³×5¹ の意です。

投稿2018/03/13 06:12

scivola

総合スコア2108

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

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

kuraudo

2018/03/15 05:46

若干コメントが遅れてしまいごめんなさい(汗 なんか素因数分解までしてる((((;´゚Д゚)))!? primeのライブラリーは知らなかった事に加え、色々面白い事が知れて良かったです! ご丁寧に考察してくださりありがとうございます!
guest

0

これでどうでしょうか?

if div_num.div(10).zero?
puts div_num
end

https://docs.ruby-lang.org/ja/latest/method/Numeric/i/div.html

投稿2018/03/13 00:35

sutonea

総合スコア207

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

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

0

ベストアンサー

割った数とその答えをかけて割られた数になれば割り切れています。

投稿2018/03/13 00:23

Zuishin

総合スコア28660

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

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

kuraudo

2018/03/13 00:26

たっ、確かに!!!((((;´゚Д゚))) (なんか笑えてきたw) ご教示ありがとうございます!笑
kuraudo

2018/03/13 00:34

あれ? でも、以下のようなコードで書いたんですけど意図通り書けてますか? num = 2017 num.times do |i| a = num/(i+1) if a * (i+1) == num puts a end end
Zuishin

2018/03/13 04:30

2017 は素数なので 1 と 2017 が出力されるはずです。こちらでやってみたらそうなりました。
kuraudo

2018/03/13 08:52

ありがとうございます! 自分でも解決できました!
guest

0

たぶん整数型に強制キャストした結果と元の計算結果が一致するかで判定するのが簡単だと思います。

投稿2018/03/13 00:23

stmkza

総合スコア478

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

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

kuraudo

2018/03/13 00:31

はい! 同様なアドバイスを他の方からも頂けました!笑 頭がかたくなってました(T_T) ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問