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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1098閲覧

PHPでの完全数の表示

raputorujp

総合スコア19

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2019/07/20 15:47

編集2019/07/21 06:16

Xを2以上の整数としてXの約数でX自身を除いた総和をSとするときX=Sは完全数でX=S+1はほぼ完全数としたときのプログラムが動きません。

入力

Y(整数の個数) X1 X2 ... XY

該当のソースコード

<?php //標準入力 $count = fgets(STDIN); while ($line = fgets(STDIN)) { $arrays[] = $line; } //総和を求める計算 for($i = 1 ; $i < $arrays[$count-1] ; $i++){ $plus = 0; if($arrays[$count-1] % $i == 0){ $plus += $i; } } //Yの数だけ出力 foreach($arrays as $array){ if($array[$count-1] == $plus){ echo '完全数'."\n"; } elseif ($array[$count-1] == $plus-1) { echo 'ほぼ完全数'."\n"; } else{ echo 'どちらでもない'."\n"; } } ?>

正しく動かないのですが、エラー箇所が特定できません。
なにか気づくことがあれば、ご指摘いただけないでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

「エラー箇所が特定できません」というのは、何故ですか?
エラーメッセージの確認ができませんか?
プロコン系のサイトで似たような問題が見つかりましたが、そのことと関係がありますか?
(ジャッジシステムでNGが出るだけで、どこがNGなのか分からない等)

とりあえず、改行を含む入力は trim() をつける癖をつけることをお勧めします。
入力データが「6」ではなく、「6(改行コード)」となることがあります。

その場合、 PHP Notice: A non well formed numeric value encountered in 〜 というエラー(Noticeレベルですが)になります。1行にある値が整数1個であれば、 intval() でも良いです。

$count = trim(fgets(STDIN)); while ($line = trim(fgets(STDIN))) {

いずれにしても、ちゃんとエラーメッセージ等が確認できる環境を構築することをお勧めします。

投稿2019/07/21 06:35

編集2019/07/21 06:39
takepan1973

総合スコア821

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

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

raputorujp

2019/07/21 14:09

申し訳ありません、エラーという表現は適切ではありませんでした。 最終的に出力はされるのですが「~の場合、完全数と表示する」といった条件にあった表示にならないのです。 ``` 完全数 ほぼ完全数 ほぼ完全数 ``` という表示が正解だとしても ``` 完全数 完全数 完全数 ``` といったようになってしまい、どこで計算がうまくできていないのかわからなくて。 `trim()`については意識していたのですが、出力の方で改行したいとなると外して使ったほうがいいかもと思ってました。 `echo`側で制御すべきでしょうか。
takepan1973

2019/07/22 00:12

なるほど。エラーというのが、プログラムエラーではなくて、正しい(はずの)回答が出ない、という意味なんですね。(「プログラムが動きません」という表現が分からなさに拍車をかけていますね) 人に相談をするときには、受け手が誤解しないような書き方になっているか、推敲することをお勧めします。 また、入力例(入力値)や出力例(出力値)を示さないのはなぜでしょうか。受け手が検証するときにあった方が回答しやすいということは、想像に難くないと思います。 細かいところで間違っている箇所がある、というよりも、コードを見る限りPHPにおける配列というものを理解していないように見受けられます。 この問題は、ある数Xi(1〜Y)に対して、Xi自身を除く約数の合計をそれぞれ計算する必要があります。 (つまりY個ないとおかしい訳ですね) これに対し、9〜15行目で計算された `$plus` は、1つだけです。 対象になっているのが `$arrays[$count-1]` になっているので、問題で言うと `XY` に対する計算しかされていません。 細かく解説をしようかと思ったのですが、指摘点があまりにも多すぎるので、想定している動き(と思われる)コードを貼りますので、動かして、考えてみてください。 <?php //標準入力 $count = trim(fgets(STDIN)); while ($line = trim(fgets(STDIN))) { $array[] = intval($line); } foreach($array as $value) { //総和を求める計算 $plus = 0; for ($i = 1; $i < $value; $i++) { if ($value % $i === 0) { $plus += $i; } } // 確認用表示 printf("%d %d\n", $value, $plus); if ($value === $plus){ echo '完全数'."\n"; } elseif ($value === $plus + 1) { echo 'ほぼ完全数'."\n"; } else { echo 'どちらでもない'."\n"; } }
raputorujp

2019/07/22 05:31

ご丁寧にありがとうございます! ご指摘頂いた内容、もっともでございます。大変勉強になるご指摘ありがとうございます。 また、コードまで考えていただき大変感謝いたします。 勉強させて頂きます。 この度は本当にありがとうございました!
guest

0

/*総和を求める計算などのコメントがコード本体も含んでしまっているのですが、これでは実行されるコードがありません。

投稿2019/07/21 00:14

maisumakun

総合スコア145121

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

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

raputorujp

2019/07/21 06:17

ごめんなさい、わかりやすくしようとしてコメントいれましたが、記述にミスがありました。 記述し直しましたので、ご面倒でなければ目を通していただけますと幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問