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

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

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

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

Q&A

解決済

1回答

531閲覧

C++ std::accumulateの総和で大きい桁に対応させる方法

opyon

総合スコア1009

C++

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

0グッド

0クリップ

投稿2018/10/30 01:14

編集2018/10/30 01:40

###解決!
回答頂いた@LouiS0616さんありがとうございました。
第3引数を 0→0LL に変更すると正常動作しました。

std::vector<long long> test2(10000, 2000000); std::cout << (long long)std::accumulate(test2.begin(), test2.end(), 0LL) << std::endl;

###知りたいこと
std::accumulateを利用した計算結果を(long long)型で得たい。
(とある問題では12桁以上必要になります)
これが仕様なのか何か基本的なミスなのかアドバイスなどご教示頂けると助かります。

###現状
とある問題で小さい桁の答えは出るのに大きい桁の答えがおかしいので調べてみるとstd::accumulateの結果がおかしいことを突き止めました。
その部分をfor文で単純計算させるとほしい結果が得られることは確認できました。
配列や計算に関連する部分を全て(long long)にしても結果変わらず。
最大桁数の(long long)でキャストしてみても結果変わらず。
以下、質問用に最低限の部分のみ抜き出したサンプルコードです。

###サンプルコード

C++

1#include <cstdio> 2#include <iostream> 3#include <vector> 4#include <numeric> 5 6int main() 7{ 8 std::vector<long long> test1(10000, 1000000); 9 std::cout << (long long)std::accumulate(test1.begin(), test1.end(), 0) 10 << std::endl; 11 12 std::vector<long long> test2(10000, 2000000); 13 std::cout << (long long)std::accumulate(test2.begin(), test2.end(), 0) 14 << std::endl; 15 16 getchar(); 17 return 0; 18}

出力結果

1410065408 -1474836480

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

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

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

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

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

guest

回答1

0

ベストアンサー

シグネチャは次のようになっています。

C++

template <class InputIterator, class T>
T accumulate(InputIterator first, InputIterator last, T init);

引用元: cpprefjp - C++日本語リファレンス / numeric / accumulate

返り値は引数 init の型と同一になりますから、そこにlong long 型のリテラルを渡せば良いです。

C++

1std::accumulate(test.begin(), test.end(), 0LL)

最大桁数の(long long)でキャストしてみても結果変わらず。

演算途中でオーバーフローが起きているのなら、返り値をいじっても意味が無いです。

投稿2018/10/30 01:26

編集2018/10/30 01:29
LouiS0616

総合スコア35660

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

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

opyon

2018/10/30 01:34

回答ありがとうございます。 0→0LLで動作確認出来ました。 盲点でした。 理解が深まりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問