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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

941閲覧

AtCoderの問題のプログラムを作って自分の端末では正常に動くが,AtCoderの採点は不正解でどこが違うのかわからない.

taknoko0112

総合スコア3

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2023/02/16 10:07

実現したいこと

AtCoderの問題に関するプログラムを作ったが,不正解で,どこが間違っているのかを知り,正解にすること.

前提

高校二年生です.
AtCoderで以下のような問題を解いています.

黒板に N 個の正の整数 A_1,...A_nが書かれています.
すぬけ君は,黒板に書かれている整数がすべて偶数であるとき,次の操作を行うことができます.
・黒板に書かれている整数すべてを,2 で割ったものに置き換える.
すぬけ君は最大で何回操作を行うことができるかを求めてください.

実行例
入力
3
8 12 40

出力
2

上記の実行例は8,12,40が二回2で割れたことを示しています.

この問題に対して自分なりにC++言語でプログラムを作ってみて,自分のpcの端末で
g++で実行してみたところ,実行例と同じような結果が得られました.なのでAtCoder
で提出したのですが不正解と出てしまい,そのあとも考えてみたのですが,全然わかりません.

なので,どこが違っているのかを知りたいので,どなたかに教えていただきたいです.

該当のソースコード

C++

1#include <iostream> 2 3 4using namespace std; 5 6int main(){ 7 int N; 8 cin >> N; 9 10 int a; 11 int A[210]; 12 for (int i = 0; i < N; i++) cin >> A[i]; 13 14 int total = 0; 15 while(1){ 16 for (int i = 0; i < N; i++){ 17 if(A[i] % 2 == 0) 18 A[i] = A[i] / 2; 19 else 20 a = 1; 21 } 22 23 if (a == 1) 24 break; 25 26 else 27 total++; 28 } 29 30 cout << total << endl; 31return 0; 32} 33

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

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

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

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

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

vann_2921

2023/02/16 10:21

endlは改行文字を出力するのでその分が答えとして余計で不正解なんじゃないでしょうか? endlがなかったらどうなりますか?
melian

2023/02/16 10:25

for ループの内部で、偶数でない場合には即座にループ処理を終了する必要があります。また、a が初期化されていません。
meg_

2023/02/16 10:30

> 実行例と同じような結果が得られました. 「2」が出力された、ということですか?当方が質問のコードを試したところ、「0」が出力されました。
Zuishin

2023/02/16 10:41

このアルゴリズムだとそもそも時間オーバーしますね。 もう一度最初から考え直しましょう。
taknoko0112

2023/02/16 11:12

Zuishinさん タイムオーバーの件に関してですが,今回上記で不正解となったプログラムは11msで正解となったプログラムも11msなので,タイムオーバーではないと思われます.
taknoko0112

2023/02/16 11:13

補足:11msは実行時間です.
Zuishin

2023/02/16 11:37

while で無限ループするかと思いましたが、よく見ると break はループ中にありますね。 それにしてもかなり独特なインデントの使い方です。
taknoko0112

2023/02/16 11:54

C言語とC++言語を勉強して一年たっていなく,だれにでもわかりやすいきれいなコードを書きたいのですが,なかなか難しく...四苦八苦している状況です.わかりやすいコードが書けるように精進します.
melian

2023/02/16 19:49

一応補足しておきますと、Linux OS(おそらく、UNIX 系 OS 全般)では初期化していない変数 a の値が 1 になる場合があります。実際、ランダム生成した数値列を入力として、a を初期化していないバージョンを 100 回連続で実行すると 20〜35 回程度は a の値が 1 になります。同一のプログラムを短時間内に(ミリ秒のオーダーはモダンな CPU では「かなり長い」というべきですが…)連続実行すると、プロセス空間を再利用(reuse)する可能性が高くなるということかと思います。正確を期すのであれば、変数 a の物理メモリアドレス(仮想メモリアドレスではなく)を調べることになりますが、面倒くさいのでもう寝ます。おやすみなさい。
guest

回答2

0

自己解決

みなさんご回答ありがとうございました.
melianさんのおっしゃる通り,forループの内部で,偶数でなかった時に,すぐループ処理を終了させるプログラムを組んだところ正解を得られました.

大変助かりました.次質問をさせていただくときには,またご回答していただければとても助かります.

投稿2023/02/16 10:39

taknoko0112

総合スコア3

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

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

thkana

2023/02/16 10:44

「たまたま」aに1が入って始まったりしないだろうか。
vann_2921

2023/02/16 11:01

次からは不正解なのかタイムオーバーなのかも書いてもらうと助かりますね。
taknoko0112

2023/02/16 11:11

タイムオーバーの件わかりました.今回上記で不正解となったプログラムは11msで正解となったプログラムも11msなので,タイムオーバーではないと思われます.
taknoko0112

2023/02/16 11:15

thkanaさん 上記のプログラムの十行目のint a;を修正したプログラムでは,int a = 0; としたので,おそらく大丈夫ではないかと思われます.
thkana

2023/02/16 11:21

> 上記のプログラムの十行目のint a;を修正したプログラムでは,int a = 0; とした あなたがやったどこにも書かれていない変更を、回答者は当然に知っているという前提での話ですか?
taknoko0112

2023/02/16 11:51

申し訳ございません.その前提の話で話していましたが,thkanaさんは知る由もありませんね.今後気を付けます.
vann_2921

2023/02/16 14:33 編集

どの競技プログラミングかは忘れましたがWA(wrong answer)とタイムアウトは別の結果が表示されます。AtCorderはそうではないということでしょうか? またmelianさんの指摘で解決したとのことですがループを即座に抜けなかったことが原因かaを初期化していなかったことが原因かが不明です。 私の経験則ではどちらも原因になり得るとは思えないのでそこもモヤモヤしますね。 (実行時間が変わらないなら即抜けなくても不正解にはなりませんよね?また、初期化の件は初期値がたまたま1だったとき以外は影響がないと思います。AtCorderの実行環境では不定のメモリは全て1で埋めてあるのでしょうか?たまたまメモリ確保した領域の4byteが1の可能性も論理的にはあり得ますが物理的にはないんじゃないかと思ったりしました。) 最終的な正解のコードを回答に書いていただけると後から閲覧した人にも分かりやすいと思います。
vann_2921

2023/02/16 14:38

初期化されてないため常に同じ結果が出ない=間違いの可能性もあるかもです。 AtCoderの仕様は分かりませんが
guest

0

最初に3を入力する、ってのは問題にはありませんが。

投稿2023/02/16 10:10

y_waiwai

総合スコア87774

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

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

taknoko0112

2023/02/16 10:14

説明不足ですいません.この質問に書いてある実行例はAtCoderで指定されたものであり,まず,どのくらいの数を入力するのかを受け付けるようになっています.今回の実行例では3つの数字の入力を受け付けたいので,3というようにしていると思われます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問