競プロ用にC++を学びなおしている。pythonとかでもいいんじゃね?と思ったがpythonだとライブラリ依存のアルゴリズムを書かねばならず少なからずコツがいるのでc++がやはり競プロのデファクト・スタンダードだと判断した。
1から100の和を出力する場合はfor文で加算する方法が凡庸な私には思い浮かびますが、
1/2*n*(n+1)で求められるそうです。(EX3 – 計算問題)ということで書いてみたが…思った結果がでない。
割り算は最後にやったほうが正しい結果が出やすいらしいので1 / 2の結果を掛け算したが0で出力されて何で?となった。C/C++では割り算の結果は切り捨てられる(おそらく割られる数の変数型で結果が決まるのだと思われるので割られる数をdouble型にキャストすることで思った通りの結果が出た)(小数点以下まで表示する方法)
普段、動的型付けのお手軽言語を使っているのでこの辺の肌感覚が失われている。なんか昔すこし意識していたなあという感じ。さすがに「なんでこんな面倒な仕組みなの?」とは思わないが。。
ただ、今回の場合は単純に(100+101)を2で割ってやれば(整数の加算なので、整数で)割り切れるのでスマート。
#include <bits/stdc++.h> using namespace std; int main() { // cout << 100 * (100 + 1) * (2 / 1) << endl; // 2分の1が1分の2になっている… // cout << 100 * (100 + 1) * (1 / 2) << endl; // 結果が0になるなぜ? // 正しい…C/C++は割られる数がdoubleでないと小数点を表せない cout << 100 * (100 + 1) * ((double)1 / 2) << endl; // cout << 100 * (100 + 1) * 0.5 << endl; // 正しい // cout << 100 * (100 + 1) / 2 << endl; // 正しい }
5050と表示されたら正解。
コメント