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

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

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

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

Sublime Text

SublimeTextとは、オーストラリアのSublime HQ Pty Ltdが提供しているテキストエディターのことです。Mac/Windows/Linuxでの利用が可能で、柔軟にカスタマイズできたり、多くの言語に対応していくこともあり、海外や日本国内でも人気のあるエディターです。

Q&A

解決済

3回答

2179閲覧

プログラム エラーについて

ayousanz

総合スコア258

C++

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

Sublime Text

SublimeTextとは、オーストラリアのSublime HQ Pty Ltdが提供しているテキストエディターのことです。Mac/Windows/Linuxでの利用が可能で、柔軟にカスタマイズできたり、多くの言語に対応していくこともあり、海外や日本国内でも人気のあるエディターです。

0グッド

0クリップ

投稿2018/03/26 13:22

編集2018/03/26 13:55

イメージ説明AOJでProgrammingを練習しています。そこでやっている問題で一つのケースだけ違うのですが、何が間違えているのかがわかりません。
教えていただきたいです。

Q.2つの整数 a と b を読み込んで、以下の値を計算するプログラムを作成して下さい:

a ÷ b : d (整数)
a ÷ b の余り : r (整数)
a ÷ b : f (浮動小数点数)
Input
1行に2つの整数 a, b が与えられます。

Output
d, r, f を1つの空白で区切って1行に出力して下さい。fについては、0.00001以下の誤差があってもよいものとします。

Constraints
1 ≤ a, b ≤ 109

このときにinputを「1000000000 1」にするとoutputが「1000000000 0 1000000000.00000000」になります。このケースが答えが違うと出てきます。

以下は書いたコードです。

c++

1#include<iostream> 2#include<iomanip> 3using namespace std; 4 5int main(){ 6 int a,b; 7 cin >> a >> b; 8 double d,r,f; 9 d = a/b; 10 r = a%b; 11 f = (double)a/b; 12 cout << d << " " << r << " "; 13 cout << fixed << setprecision(8) << f << endl; 14 return 0; 15}

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

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

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

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

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

ayousanz

2018/03/26 13:28

LessonーITP1 1-4-aです。
mkgrei

2018/03/26 13:37

上限が10^9なんですね。
guest

回答3

0

ベストアンサー

drdoubleで指定していますので、値の大きさによっては出力が指数表記になります。しかし、出力は整数として表示することを求めているため、指数表記になった場合に正解とは判断されません。

参考: paiza.ioでの実行結果

これを直すには、

C++

1double d,r,f;

ではなく

C++

1int d, r; 2double f;

とすれば、うまくいくと思います。

投稿2018/03/26 14:39

編集2018/03/26 14:42
raccy

総合スコア21733

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

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

ayousanz

2018/03/26 14:44

変更してみたところすべて通りました。 ありがとうございます。 上のことを知らなかったので勉強になりました。
guest

0

※その問題、私も過去にやったことがあります。
コンパイラ(ライブラリの挙動?)のせいでしょうか。手持ちのcygwin版g++ ですと、質問者さんのコードは以下のような結果になりました。

plain

1$ cat 1.cpp 2#include<iostream> 3#include<iomanip> 4using namespace std; 5 6int main(){ 7 int a,b; 8 cin >> a >> b; 9 double d,r,f; 10 d = a/b; 11 r = a%b; 12 f = (double)a/b; 13 cout << d << " " << r << " "; 14 cout << fixed << setprecision(8) << f << endl; 15 return 0; 16} 17 18$ g++ --version 19g++ (GCC) 6.4.0 20Copyright (C) 2017 Free Software Foundation, Inc. 21This is free software; see the source for copying conditions. There is NO 22warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 23 24$ g++ -Wall 1.cpp 25 26 27$ ./a.exe 281000000000 1 291e+09 0 1000000000.00000000 30 31$

当質問で質問者さんがあげられているのは、問題ITP1_4_A のtestcase#7 ですが、
入力が"1000000000 1"で、出力が"1000000000 0 1000000000.00000000"のところ、
上の実行例ですと"1e+09 0 1000000000.00000000" です。これだとNGです。

質問者さんがサブミットされる前に、どのコンパイラで試されたのでしょうか。AOJで使われているC++コンパイラと違うのかもしれません。(AOJで、何が使われているか分からなかった。どっかで見たような気がするのだけど、不確か)

ちなみに、私がこの問題でパスした例が以下、です。printf を使っていてC++としては自分でもズルいと思っているのですが、ご勘弁を。

C++

1#include <iostream> 2#include <stdio.h> 3 4int main() { 5 6 int a, b; 7 std::cin >> a >> b; 8 9 int ans1 = a / b; 10 int ans2 = a % b; 11 double ans3 = (double)a / (double)b; 12 13 printf("%d %d %.5f", ans1, ans2, ans3); 14 15 return 0; 16} 17 18

上の実行例です。

$ ./a.exe 1000000000 1 1000000000 0 1000000000.00000

投稿2018/03/26 14:22

編集2018/03/26 14:25
dodox86

総合スコア9181

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

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

y_waiwai

2018/03/26 14:25

どれが間違ってるというはなし??
dodox86

2018/03/26 14:30

恐らくですが、質問者さんで試されたときは「"1000000000 0 1000000000.00000000"」で出力されて、そのコードでAOJへサブミットして、合っているはずなのにNGとなるので、何が間違っているだ?ということではとの推測です。私の回答は、質問者さんのコードをローカルのg++でコンパイルするとその答え(出力結果にならない)ので、コンパイラが違うか、stdのライブラリのどっかの挙動が違うのでは?との意見です。
mkgrei

2018/03/26 14:33

pythonでやったら普通に通ったので、C++のなにかに依存した問題ですね。 手元でやっても変なことが起きないので、向こう側のコンパイラの問題かと。
y_waiwai

2018/03/26 14:34

えーと、どの結果でもあってるというはなしでいいのね。
ayousanz

2018/03/26 14:37

コンパイルは「min g++」?(この名前でいいのかはわかりませんが)を使っています。 c言語が使えないのでprint系がさっぱりで・・
y_waiwai

2018/03/26 14:40

間違いと言ってるヤツが間違い、というオチということで。ちゃんちゃん
dodox86

2018/03/26 14:44

AOJのいくつかの問題は私もやっている(今も少しづつ)のですが、実数が出てくるとき、小数点以下の桁数によって「0.00001以下の誤差」がうまく許容されていないと思えるケースが散見されました。なのでprintf で逃げたのも理由にあります(私の例の"%.5f"はその小細工)いいとは思ってないので、正しいやり方を知りたいところです。
mkgrei

2018/03/26 15:03

問題文からは読み取れなかった仕様ですので、良い教訓になりました。 勉強になりました。 出力を行儀よく整形するのは小細工ではないと思います。 coutでがんばるのなら。 https://wandbox.org/permlink/nTAjeHLVcVI7HatZ
dodox86

2018/03/26 15:14

>mkgrei さん 実数の扱いが苦手なのを自認していますので、大変勉強になります。どうもありがとうございます。 (wandboxの例はローカルに保存させてもらいました)
guest

0

どの答えが違うというはなしなのでしょうか?

投稿2018/03/26 13:43

y_waiwai

総合スコア87715

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

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

ayousanz

2018/03/26 13:46

なんパターンか試してその一つが違うことらしいです。 上の説明の真ん中あたりのものなのですが、inputを「~~」にしてときにwrong answerになります
y_waiwai

2018/03/26 13:47

いやだから、どれが間違っているのか?ということをきいてますが。
ayousanz

2018/03/26 13:49

私の理解ができてなくてすみません。 どれが間違っているというのがいまいちわかりません。どれがというのはコードのことでしょうか。
y_waiwai

2018/03/26 13:51

>このケースが答えが違うと出てきます。 どれが間違ってるというはなしですか?
y_waiwai

2018/03/26 13:55

> 1 ≤ a, b ≤ 109 この条件にあってないから間違いと言う話かな?? #春休み案件?
ayousanz

2018/03/26 13:56

なるほどです!!一度書き換えてみます
ayousanz

2018/03/26 13:57

bの範囲が10^9になっているのでこれは大丈夫なのでしょうか・・・ 課題等ではないです
y_waiwai

2018/03/26 13:57

なんかよーわからんけど、結局その間違いと言ってるやつの間違いというオチだったり?w
y_waiwai

2018/03/26 13:58

範囲は109以下なんでしょ? はなしがわからん。。
y_waiwai

2018/03/26 14:08

すべてが間違いだらけ? 間違ってないのは出力だけというオチw
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問