見出し画像

ABC206 A 解答

A - Maxi-Buying(5)

問題

問題文

ABC 国の消費税率は 8 パーセントです。
ABC 国にはエナジードリンク屋さんがあります。ここでは、エナジードリンク 1 本を、税抜き N 円で販売しています。
ここに消費税を加算した後の金額は ⌊1.08×N⌋ 円となります。ただし、実数 x に対し、⌊x⌋ は x 以下の最大の整数を表します。
この金額が定価の 206 円より安いなら Yay! 、定価と等しいなら so-so 、定価より高いなら :( と出力して下さい。

制約

1 ≤ N ≤ 300
N は整数

考察

税込価格を求めます。本問題で重要となるのは、

小数の扱い

です。消費税は8%ですので、そのまま、*1.08と計算してしまうと誤った結果になってしまいます。コンピュータでは小数を正確に表すことができないので、微妙に値がずれてしまいます。

ですので、小数を介さずに計算することが求められます。ということで、まずは100倍した結果を求めます。これは

*108

ですね。まだ整数しか登場していません。次に勝手に100倍したので100で割りましょう。この時、整数の範囲で計算をしているので、小数点以下の値は切り捨ててくれます(Pythonだと「//」の演算です)。本問題は小数点以下切り捨てで良いので、この値を判定に使いましょう。

これが206以上、206、206以下の3つの場合に分けてあげれば無事正解となります。

実装

 #include <bits/stdc++.h> #define  rep(i,n) for(int i=0;i<n;++i) #define  reps(i,s,n) for(int i=s;i<n;++i)
using namespace std;
using ll = long long;
using P = pair<int, int>;
using T = tuple<int, int, int>;

int main()
{
   int n;
   cin >> n;
   n = 108 * n;
   n /= 100;
   if (n < 206) cout << "Yay!" << endl;
   else if (n > 206) cout << ":(" << endl;
   else cout << "so-so" << endl;

   return 0;
}

あとがき

小数点の問題はちょこちょこと出題されるので、整数型で処理したり、文字型で処理したり、はたまた誤差が一定値以下ならOKだったりと色々なケースを体験しておくと良いと思います。

また本問題の出力はちょっと特殊でしたね。楽しいので良いのですが本番はタイプミスが怖くて急いでコピペしました。個人的に話題の多いA問題でした。

この記事が気に入ったらサポートをしてみませんか?