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

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

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

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

C++

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

Q&A

解決済

1回答

1625閲覧

入力待機が続いてしまう

grape_ll

総合スコア83

標準入力

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

C++

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

0グッド

0クリップ

投稿2020/09/14 07:01

以下のリンクの問題を解いていました.
考えとしては,2の因子がすべての要素で合計何個あるかを調べるという考えで以前にC言語を用いてACしているので,同じようにしてC++で書いてみたのですが,こちらではWAとなってしまいました.
5番目のテストケースを調べてコピー&ペーストしたのですが,入力待機画面が続いてしまいました.要素数が10000個なのできちんときれいに張り付けられたのかは確かめにくいのですが,要素数が足りないのかと考え,てきとうに1を入力し続けてみても出力には移行しませんでした.
テストケースの10個などではきちんと動作していました.
なぜこのようなことが起きてしまうのか教えていただきたいです.

問題

以前に自分で書いたコード(AC)

C

1#include<stdio.h> 2#include<stdlib.h> 3#include<math.h> 4#include<string.h> 5long num_two(long a_n){ 6 long count=0; 7 if(a_n%2!=0){ 8 return 0; 9 } 10 while(a_n!=1){ 11 a_n/=2; 12 count++; 13 if(a_n%2!=0){ 14 return count; 15 } 16 } 17 return count; 18} 19int main(void){ 20 int num; 21 long *a_n; 22 long sumcount=0; 23 24 scanf("%d",&num); 25 a_n=(long *)malloc(sizeof(long)*num); 26 int i; 27 for(i=0;i<num;i++){ 28 scanf("%ld",&a_n[i]); 29 sumcount+=num_two(a_n[i]); 30 //printf("%ld:\n",sumcount); 31 } 32 printf("%ld",sumcount); 33 34 free(a_n); 35 return 0; 36} 37

今回書いたコード(WA)

C++

1#include<stdio.h> 2#include<iostream> 3#include<string> 4#include<memory> 5#include<cmath> 6#include<algorithm> 7#include<vector> 8int main(){ 9 int length; 10 std::cin>>length; 11 12 std::vector<long long> vec(length); 13 std::vector<int> judge(length); 14 15 long long count=0; 16 long long sum=0; 17 long long flag=0; 18 19 for(int i=0;i<length;i++) { 20 std::cin>>vec[i]; 21 if(vec[i]%2==0) judge[i]=0; 22 else{ 23 judge[i]=1; 24 flag++; 25 } 26 } 27 28 if(flag==0){ 29 std::cout<<0<<std::endl; 30 return 0; 31 } 32 33 for(int i=0;i<length;i++){ 34 if(judge[i]==0){ 35 count=0; 36 while(vec[i]%2!=1){ 37 vec[i]/=2; 38 count++; 39 } 40 sum+=count; 41 } 42 } 43 long long ans=sum; 44 std::cout<<ans<<std::endl; 45 return 0; 46}

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

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

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

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

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

guest

回答1

0

ベストアンサー

コピー&ペーストしたのですが,入力待機画面が続いてしまいました

追記:コメントでご指摘があったので。
標準入力でコピペするデータ量が多すぎて心配な時は、ファイルから読み込ませる方法で試すと良いです。
今後のためにもまだやったこと無いようでしたら検索してやり方を覚えておいたほうが良いと思います。
今は出来なくてもそういう手法のデバッグ方法もあるのでご参考までに。
C, C++でのファイル入力をまとめてみたよ

公式解説

直接の回答ではありませんが、1つづつ怪しいと思う箇所を解説のコードと見比べながら削って消してみて関係無さそうなら元に戻すなどの作業を繰り返すデバッグでの問題点の切り分けを行えば原因が分かるかもしれません。

解説を読んでサンプルコードを読めばやることはシンプルなので、
ご自分のコードでやらなくても良いことを省くだけでACになると思います。
省いてゆく過程で、「問題の現象が見られなくなった時」(ACになった時やなどに)
何が原因だったかが判明すると思われます。
(未検証未実装)

やることを箇条書きにする癖をつけたほうが良いと思います。
解説と自分のコードとの違いを把握する為や
自分の考えを整理することにもなるのでおすすめです。

1.数列を標準入力で配列に格納する
2.配列の各要素を順番に偶数か判定する
3.要素が偶数なら1になるまで2で割り続けその回数をカウントする
4.全ての要素で2~3を繰り返す
5.カウントの総数を出力する

公式解説サンプルコード

C++

1#include <iostream> 2using namespace std; 3 4int n, a[10009], sum; 5 6int main() { 7 cin >> n; 8 for (int i = 1; i <= n; i++) { 9 cin >> a[i]; 10 while (a[i] % 2 == 0) { a[i] /= 2; sum++; } 11 } 12 cout << sum << endl; 13 return 0; 14}

投稿2020/09/14 09:10

編集2020/09/14 10:33
mjk

総合スコア303

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

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

fana

2020/09/14 09:26 編集

低評価の理由: 本件は 「入力待機が続いてしまう」→「なぜこのようなことが起きてしまうのか教えていただきたい」 という話ですから, この内容では本件に対する回答とはならないと思うのです.
mjk

2020/09/14 09:34

仰るとおりですが解説と解説のサンプルコードを読めばやることがシンプルなのは自明です。 それを試すなどしていないのでヒントになればと思い回答しています。 「回答とはならない」ということはヒントやアドバイス的なことを回答してはならないということでしょうか?
fana

2020/09/14 09:43

> 以前にC言語を用いてACしている とのことですので,その「シンプルなやること」については(コードの良し悪しは別として)既に把握されているものと推測します. 本件は,リンク先の問題の解法を求めているのではなくて, 提示されたC++側コードの「(おそらく)最初のforから何故か処理が抜けない」「そうなるかどうかは入力の個数に依存するようだ(?)」という不思議な現象に関して質問されているのだと思うのです. この回答は,そのことに関するヒントやアドバイスになっていないのではないか? ということです.
mjk

2020/09/14 09:45

https://teratail.com/questions/291750#reply-412863 fanaさんの直近の回答を1つ拝見させていただきましたが、これヒントですよね? 違いが分かりませんがfanaさんの回答の定義とはどういったものでしょうか。
fana

2020/09/14 09:47 編集

質問者が > ヒントだけでも結構です。 と明示しているので. というか,「そのリンク先が問題としている事柄そのものに対する」ヒントなので.
mjk

2020/09/14 09:47

>>「そうなるかどうかは入力の個数に依存するようだ(?)」という不思議な現象に関して質問 だとしても公式の解説コードは明らかにシンプルです。 ぱっと見明らかに余分なことをしている過程に原因があると推測できるので、それくらい試したらどうでしょうか?という回答です。
fana

2020/09/14 10:14

とりあえずごちゃごちゃしている物を取っ払って行きながら動作の変化を見よ → その過程で問題の現象がなくなる瞬間があればそこが要因である → …ということをまずは自力で試せ ということですね. 回答の趣旨を把握できましたので,不当な評価を取り下げさせていただきます. 大変失礼いたしました.
mjk

2020/09/14 10:18

いえこちらこそ分かりにくくてすみません。 自分も問題を解いたり解けない時に試行錯誤しているので、 完全な答えやコードだけを求めずに自分で努力する人には出来るだけアドバイスやヒントで、 自力で解けたほうが後々のその方の為になると思いながら回答しています。
fana

2020/09/14 10:23

失礼ついでに…… > 省いてゆく過程でACになった時に何が原因だったかが判明する ここの「ACになった時」の部分が,「問題の現象が見られなくなった時」のような表現である方が, より回答の趣旨に沿う形になるのではないかと存じます. (ACになるのが目的ではないので)
mjk

2020/09/14 10:25

ご指摘ありがとうございます。 仰るとおりですね、後ほど修正しておきます。
grape_ll

2020/09/15 07:23

これまでの経過と,更新された回答の方,読ませていただきました. ファイルで入力してみるとうまくいくかもしれないということは知りませんでした.今後の参考にさせていただこうと思います. 原因はflagの使い方であったみたいです.ご回答ありがとうござました.
fana

2020/09/15 07:33

> 原因はflagの使い方であったみたいです flag++; なる記述が問題の現象(:ずっと入力待機状態になる)を誘発するという話ですか?(だとしたら,何が何だかわからない話だが…?)
mjk

2020/09/15 12:48

>>入力待機状態になる flagが原因でしたか。 入力待機状態になっていたのは1万件にもなるテストケースが大きすぎたからではと思っていたのですが。 ともあれ自力で解決したのでしたら達成感あると思うのでそれはそれで良かったです。
grape_ll

2020/09/23 07:05

分かりづらかったですね.申し訳ございません 入力待機状態はテストケースが大きくなってしまっていたからで,WAになってしまっていた原因がflagの部分であったということです.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問