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

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

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

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

Q&A

解決済

2回答

1594閲覧

C++|逆数の総和の逆数

yshk0402

総合スコア10

C++

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

0グッド

0クリップ

投稿2019/08/27 12:55

問題

AtCorderの過去問です。
N個の整数の列
A1~AN
が与えられます。

これらの逆数の総和の逆数
1/(1/A1 + ... + 1/AN)
を求めてください。 という問題です

C++

1#include <bits/stdc++.h> 2using namespace std; 3int main(){ 4 int N,b = 0; 5 cin >> N; 6 7 int arr[N]; 8 9 for(int j = 0; j < N; j++){ 10 cin >> arr[j] ; 11 12 b += arr[j]; 13 } 14 cout << 1/(1/b) << endl; 15 16 return 0; 17}

課題

上のようなコードを書いたが実行時にa.exeが動作を終了してしまう。

環境

エディタ Atom
コンパイラ MinGW

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

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

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

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

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

guest

回答2

0

1/bの結果が0になっているため0除算が発生しています。途中の計算式も間違っています。
正しくは下記のようになるのではないでしょうか。

C++

1 double b = 0.0; 2 3 for(int j = 0; j < N; j++){ 4 cin >> arr[j] ; 5 6  b += (double)1/arr[j]; 7 } 8 cout << 1/b << endl;

投稿2019/08/27 13:18

編集2019/08/27 13:52
gnbrganchan

総合スコア438

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

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

yshk0402

2019/08/27 13:20

そうでした。 ありがとうございました
Zuishin

2019/08/27 13:21

途中の計算で double を使うと誤差が出るので、これでは通らないと思います。
kazuma-s

2019/08/27 14:31

N = 2, arr[0] = 100000, arr[1] = 100000 のとき、 cout << 1/b で 50000 と表示されますが、 if (1/b == 50000) cout << "OK\n"; else cout << "NG\n"; では、 NG と表示されますね。
Zuishin

2019/08/28 05:06 編集

小数を使う以上、誤差の許容があるのは当然ですが、この計算方法だと入力によっては誤差が大きくなりすぎて通らないのではないかと思います。 なぜ思うのかというのは、勘です。これが正解ならあまりに簡単すぎます。 簡単な問題なのだとしたら、この限りではありませんが、合計を求めるロジックとほぼ同じものを問題にするでしょうか? また一つの数字につき二回も割り算させている意味は? この辺り、臭いませんか? 式を変形させると割り算は一度で済みます。つまり誤差が少なくなります。その代わりに桁溢れに対処しなくてはならなくなり、問題点が高度になります。ゆえにこちらが正解だと思いました。 ただの勘ですから、簡単な問題だという可能性はもちろん否定できませんが、私なら後者の方法で提出します。
ikadzuchi

2019/08/28 14:50

多倍長演算を自作ですか。 あまりそのような問題が出るとは思いませんね。勘ですが。
Zuishin

2019/08/28 14:57 編集

何度も当たったことがあります。経験ですが。 多倍長とメモ化と順列組み合わせの用意は競技プログラミングをする前には準備をしておくものなんじゃないんでしょうか?
asm

2019/08/28 23:57

Beginner問題だったら多倍長必要なのは珍しいですね
Zuishin

2019/08/29 00:01

ああ、見落としていました。Beginner 問題だったんですね。 それならコードにそこまでの精度は必要ありませんね。 単に簡単な問題だったということですか。
guest

0

ベストアンサー

1 / b が 0 になるため、0 除算で落ちているのでしょう。

投稿2019/08/27 13:06

Zuishin

総合スコア28660

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

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

yshk0402

2019/08/27 13:15

bをint型からfloat型に変えると普通に実行できました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問