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

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

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

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

Q&A

解決済

1回答

943閲覧

AtCoderでのto_string関数の振る舞い

Yhaya

総合スコア439

C++

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

0グッド

0クリップ

投稿2018/10/01 12:59

編集2018/10/01 13:40

状況

C++の練習のためにAtCoderの簡単な問題を解いています。以下の問題で躓いたのですが理由がよく分からないので教えていただきたいです。

ABC001 B 問題ページ

気象情報は、世界中に様々な形で流れています。そのひとつの地上実況気象通報式 (SYNOP) では、視程 (肉眼で物体がはっきりと確認できる最大の距離) を、次の規則に従って、VVという値 (通報式) に変換して報じます。

  1. 0.1km 未満: VVの値は 00 とする。
  2. 0.1km 以上5km以下:距離(km)を10倍した値とする。1桁の場合は上位に0を付す。

...

これに対して私は次のようなコードを書きました。

C++

1#include <iostream> 2#include <string> 3using namespace std; 4 5int main() { 6 int m; 7 cin >> m; 8 9 if (m < 100) { 10 cout << "00"; 11 } 12 else if (100 <= m && m <= 5000) { 13 m /= 100; 14 string num; 15 if (m < 10) { 16 num = "0" + to_string(m); 17 } 18 else { 19 num = to_string(m); 20 } 21 22 cout << num << endl; 23 } 24 else if (m >= 6000 && m <= 30000) { 25 cout << m / 1000 + 50 << endl; 26 } 27 else if (m >= 35000 && m <= 70000) { 28 cout << (m - 30) / 5 + 80 << endl; 29 } 30 else { 31 cout << 89 << endl; 32 } 33}

自分の環境(Visual Studio 2017)ではきちんとコンパイルも通り、AtCoderの入力例に対しても正しい値を出力します。

しかし、提出するとコンパイルエラーになってしまいます。この時のエラーメッセージが

./Main.cpp: In function ‘int main()’: ./Main.cpp:16:27: error: ‘to_string’ was not declared in this scope num = "0" + to_string(m); ^ ./Main.cpp:19:21: error: ‘to_string’ was not declared in this scope num = to_string(m); ^

という感じになっています。to_stringのスコープが違うみたいな感じだと思うのですが、よく分かりません。

ちなみに、提出時の言語には「C++ (GCC 5.4.1)」を選んでいます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーの原因

std::to_string() は C++11 で導入された関数です。C++ (GCC 5.4.1) を選択すると、C++03 でビルドされるので、コンパイルエラーになります。

g++ -std=gnu++03 -O2 -I/opt/boost/gcc/include -L/opt/boost/gcc/lib -o ./a.out ./Main.cpp

選択項目の実際のビルドオプションは こちら で確認できます。

解決方法

C++14 (GCC 5.4.1) を選択する。

気づいたこと

35km以上、70km以下のとき、メートルの値mを1000で割る処理が抜けています。

サンプルコード

通ったサンプルコードを載せておきます。

cpp

1#include <iostream> 2#include <string> 3 4int main() 5{ 6 int m; 7 std::cin >> m; 8 9 if (m < 100) { // 0.1km 未満 10 std::cout << "00" << std::endl; 11 } 12 else if (100 <= m && m < 1000) { // 0.1km以上、1km未満 13 std::cout << "0" << (m / 100) << std::endl; 14 } 15 else if (1000 <= m && m <= 5000) { // 1km以上、5km以下 16 std::cout << (m / 100) << std::endl; 17 } 18 else if (6000 <= m && m <= 30000) { // 6km以上、30km以下 19 std::cout << (m / 1000 + 50) << std::endl; 20 } 21 else if (35000 <= m && m <= 70000) { // 35km以上、70km以下 22 std::cout << ((m / 1000 - 30) / 5 + 80) << std::endl; 23 } 24 else { // 70kmより大きい 25 std::cout << 89 << std::endl; 26 } 27} 28

投稿2018/10/01 15:31

tiitoi

総合スコア21956

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

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

Yhaya

2018/10/01 22:27

ありがとうございます。解決しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問