久しぶりにコンテストに出ました。前回いつ出たんだろ?と思ったら5月で、まじかよおいってなってます。3年間で10回すらコンテストでてないというね。流石にやばいんで、年度内に緑にはなっておきたい・・・。
それはさておき、ABS関数の話です。ABC113のB問題でabs関数を使いました。それで、次のようなコードを書きました。
#include <iostream> | |
#include <math.h> | |
using namespace std; | |
int main(int argc, char const *argv[]) { | |
int n; | |
double t,a; | |
cin>>n>>t>>a; | |
double h,tem,min,ans; | |
for(int i=1;i<=n;i++){ | |
cin>>h; | |
if(i==1){ | |
min=abs(a-(t-h*0.006)); | |
ans=1; | |
}else{ | |
tem=abs(a-(t-h*0.006)); | |
if(tem<min){ | |
min=tem; | |
ans=i; | |
} | |
} | |
} | |
cout<<ans<<endl; | |
return 0; | |
} |
それで自分の環境でコンパイルしたわけですが、ちゃんとコンパイルでき、答えもサンプルとおなじになりました。そして、提出をすると、結果がCE(Compile Error)。なんでや!!と思って調べたら、次のような文章が見つかりました。
これまでのところ:math.hはCであり、10年以上前に作成されました。 math.hでは、その基本的性質のために、abs()関数は整数型の “本質的”なので、double型の絶対値を取得したい場合は、fabs()を使用しなければなりません。 C++を作成したときにはmath.hとなり、cmathとなりました。 cmathは本質的にmath.hですが、C++では改善されています。 abs()とabsを区別する必要があるなどの改善が加えられ、double型とinteger型の両方に対してabs()が作成されました。f要約すると 次のいずれか 使用のmath.hとダブルス または 使用cmathための整数のabs()、fabs()を使用し、ちょうどすべて(簡単かつ推奨)
あいまいなオーバーロードの呼び出し(doble)
math.hでabs関数を用いると、引数にint型を用いなければならず、double型を用いるときにはfabs()を用いなければならない。しかし、cmathの場合はabs()でint型以外の方も引数として取れる、らしいです。知らんかった。
コード書いてるとき、「abs関数って因数double型いけたっけ?」と思ってcpprefjp – C++日本語リファレンスで調べたんですが、よく見たら”cmath/abs”ってなってました。
ということで、C++書くときはcmath使おうと思いました。
そもそも競プロなら、”#include<bits/stdc++.h >”でいいんだよなあ・・・。