0
0
競技プログラミングをしています。C++を使っているのですが整数値を扱う時に統一して long long int 型を用いるのはやめたほうが良いですか?使い分けが少しめんどくさいのですが...
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
#1
総合スコア12010
投稿2024/12/05 09:12
編集2024/12/05 09:33意味がよくわからないので,話の前提か何かを明確に述べた方が良いのではないかと思います.
- 「
int
とかだと収まらなくてlong long int
だと収まるような値というのを頻繁に扱うような作業」みたいな場面に関しての話……ということなのでしょうか? - CPUのアーキテクチャ(?)か何かの都合で,どのサイズの演算が早いとか遅いとかいう話もありそうですが(私はその辺わからないけど),そういう面での話をしているのでしょうか?
競技プログラミングをしています。
という編集を受けて:
そういう世界の話であれば, あなたが最も{楽,手っ取り早い,etc}と思うやり方を選べばよい のかな,と思います.
(何かメモリ使用量の制限みたいなが設けられていてそれに引っかかったりとかしない限りは.)
私はそれ系に手を出したことはないので実情はよく知らないのですが,
「競技プログラミング long long」とかググってみると #define int long long
なんていう話すらもある様子(?).こわい.
#4
総合スコア501
投稿2024/12/05 11:42
一個人の意見ですが、競技プログラミングにおいては整数型を long long (int)
に統一して問題ないと思います。
私も競技プログラミングをやっていますが、私が整数型がらみで起こしたミスは主に
long long
にすべきところをint
にしたせいでオーバーフローが発生する- 非常に長い配列(または大きなデータ構造)の要素の型を
long long
型にしたせいでメモリ制限超過(MLE)が発生する
の2つです。
そして、私の体感ではこれらのミスが起きる頻度は前者のほうがとても高く、一方後者はめったに起きません。
そのため、整数型は基本的にlong long
で統一してしまい、MLEが起きたときは個別に対応すればよいと思います。
他の方も言及しているスニペットの話については、#define int long long
のように既存の型を書き換えてしまうものは流石にマズいですが、using ll = long long;
のように他の命名と被らない別名を用意してあげるのは問題ないと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#5
総合スコア5694
投稿2024/12/05 14:05
プログラム一般の常識で言えば各々の場面で使い分けるに越したことは無いです。 どういう値を取り扱うつもりなのかという意図が型に現れるのでプログラムを読むときのとっかかりになるからです。
自分が書いたプログラムでも少し時間がたつとどういう意図でやっているのか驚くほど忘れるものです。 プログラミングをやっていると自分が馬鹿だと思い知ることが何度もあるはずです。 ましてや他人が読むこともある場合だとかなり親切に書かないととても読めないものが生まれてしまいます。
逆に言えば読み返すことがない (長期的な保守をしない) ことが分かっている競技プログラミングでは問答無用で整数は long long int
を使うということにしてもそれほど問題になりませんし、実際にやってる人は結構います。
しかし、競技にどういう姿勢で望むかにもよるでしょう。 もしプログラミングの練習として競技プログラミングをやるなら競技のために一般的な作法を捨てるのは本末転倒と言えます。
エンタメとして競技に取り組む場合ならあえて行儀の悪い方法を取り入れてでもスコアを突き詰めるというのも悪いわけではありませんし、ご自身がどういう考え方で競技をやるかによるんじゃないでしょうか。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。