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

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

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

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Ruby

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

1回答

1071閲覧

完全数かどうかを判別するためのプログラムを書きたい

sandiegoooooo

総合スコア0

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Ruby

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/08/12 16:45

編集2020/08/12 22:12

前提・実現したいこと

完全数かどうかを判別するためのプログラムを書きたいです
Rubyを用いて入力された自然数が完全数かどうかを判別するためのプログラムは以下コードで"n="に数値を入れることで実現できました。ですが、
標準入力から値が渡される以下条件下のコードとなると分からなくなってしまいます。

N を 2 以上の整数とし、N の約数のうち N 自身を除いたものの和を S とする
N = S となるような N を完全数
・|N-S| = 1 となるような N を完全数に近いとする。

Q
N_1
...
N_Q

1行目には判定したい整数の個数 Q が入力される。
続く Q 行には整数 N_1, ..., N_Q が入力される。

・N_i が完全数であれば "完全数"
・N_i がほぼ完全数であれば "完全数に近い"
・どちらでもなければ "完全数でない"

入力例
3
28
16
777
出力例
完全数
完全数に近い
完全数でない

初学者でして初歩的な質問で申し訳ありません。
ご教授いただけるとありがたいです。

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

出力例のように、入力例
3
28
16
777
出力例
完全数
完全数に近い
完全数でない 
とならず、
完全数
完全数でない
までしか出力できません。

該当のソースコード

puts "自然数が完全数かどうかを判別します。" puts "自然数nを入力してください。" print "n=" number = gets.to_i sum=0 for i in 1..number-1 do if number%i==0 then sum+=i end end if number==sum then print "完全数" else print "完全数ではない。" end

上記のコードを参考に書いてみた

n = readlines.map(&:to_i) number = gets.to_i plus = 0 i = 1 begin if (number % i === 0) then plus = plus + i end ((i += 1) - 1) end while i < number if number == plus then puts "完全数" elsif puts "ほぼ完全数" else puts "完全数でない" end

この条件下では、line = readlines.map(&:to_i)を使おうか?
この条件下ではどうしたら良いのか?等

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

maisumakun

2020/08/12 21:47

「完全数に近い」はどのように判定するのですか?
sandiegoooooo

2020/08/12 21:57

完全数に近いは私が考えたのはplus += 1、もしくはplus -= 1などの条件をつけることによって判定できるのかなと考えたのですが、、、うまくいきませんでした。
maisumakun

2020/08/12 21:59

「私が考えた」のではなく、もとの問題に定義してありませんか?
sandiegoooooo

2020/08/12 22:01

質問の意図を汲み取れていませんでした。申し訳ございません。 |N-S| = 1 となるような N を完全数に近いとする。となっているようです。
sandiegoooooo

2020/08/12 22:14

N を 2 以上の整数とし、N の約数のうち N 自身を除いたものの和を S とする N = S となるような N を完全数 ・|N-S| = 1 となるような N を完全数に近いとする。 条件を付け足しました。申し訳ございません。 elsif の条件として、思いつくものが先ほどのplus -= 1 なのですが、これはどういう間違った認識をしているのかをご教授願えないでしょうか。
guest

回答1

0

plus += 1、もしくはplus -= 1などの条件をつけることによって判定できるのかなと考えたのですが、、、うまくいきませんでした。

該当の条件が書かれていないようです。そして、elsifに条件式がないので、このままでは文法的に成立しません

投稿2020/08/12 22:07

maisumakun

総合スコア145184

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

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

maisumakun

2020/08/12 22:18

> plus -= 1 Rubyでは、数値はどんな値であろうともtrueです。
sandiegoooooo

2020/08/12 22:37

申し訳ございません。勉強不足で条件式が思いつきません。 どうかヒントをいただけないでしょうか。
maisumakun

2020/08/12 22:38

|N-S| = 1 をそのままRubyのコードに起こすだけです。
sandiegoooooo

2020/08/12 22:44

numer -plus == 1 としたのですが、そうすると出力結果が"完全数でない"とだけ出てきます。 また、条件として|N-S| は N-S の絶対値を意味する。とありました。 度重なる修正申し訳ありません。
maisumakun

2020/08/12 22:45

絶対値は.absというメソッドがあります。
sandiegoooooo

2020/08/12 22:52

ありがとうございます。  (number - plus).abs == 1と記載したところ、またもや出力結果が"完全数でない"とだけ出てきました。 これはどこが問題なのでしょうか。度重なる質問申し訳ございません。
maisumakun

2020/08/12 22:55

ループの途中に入っている「((i += 1) - 1)」はどういう意味でしょうか?
sandiegoooooo

2020/08/12 23:05

まずは、約数を探し、それを足すことかなと考えました。 約数ということはつまり「その数字で元の数字が割り切れる=あまりが0」であるため、そのように条件分岐を記載いたしました。条件分岐を通り抜けた数字は変数に追加するという処理を行うことで、約数をすべて足し合わせた処理を行ったつもりです。。。
sandiegoooooo

2020/08/12 23:07

こんな私のために解答してくださり、心からありがとうございます。
sandiegoooooo

2020/08/12 23:08

また、ループ部分を for i in 1..number-1 do if number%i==0 then sum+=i end end と変えたらどうかと考え実行したのですが、これもうまくいきませんでした。。
sandiegoooooo

2020/08/12 23:11

もしよろしければこのループ処理のところをご教授願えませんでしょうか。 本当に申し訳ございません。
maisumakun

2020/08/12 23:20

複数個の入力を処理したいのであれば、「判定→表示」という全体の流れをループさせる必要があるかと思います。
sandiegoooooo

2020/08/12 23:30

申し訳ございません。 完全に私の知識不足ですが、その処理をしたつもりでコメント上記のfor文かなと考えました、、 どうかご教授願えないでしょうか。
maisumakun

2020/08/12 23:32

getsを1回しか通らない以上、現状のコードでは入力される値は1つです。
sandiegoooooo

2020/08/12 23:41

getsを通すにはどの部分をどう書き換えたらよろしいでしょうか? トライしたこととしましては n = readlines.map(&:to_i) number = gets.to_i number.times do plus = 0 or i in 1..number-1 do if number%i==0 then plus += 1 end end if number == plus then puts "perfect" elsif (number-plus).abs == 1 puts "nearly" else puts "neither" end end timesメソッドを使ってみたのですが。。 抽象的な質問で本当に申し訳ないです。
maisumakun

2020/08/12 23:51

> トライしたこととしましては ループさせたのはいいのですが、ループの中にgetsがなければ、データの読み込みは行われません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問