けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 314 A - 3.14 (灰色, 100 点)

円周率の問題が出るのは多くの人が想定していた。円周率を文字列にしてしまえばいいという発想が少し難しいかもしれない。また、添字計算が少し大変だったかもしれない。

問題概要

円周率  \pi の小数点第 100 位までは

3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

となっている。正の整数値  N が与えられるので、円周率の小数第  N 位までの値を出力せよ。

制約

  •  1 \le N \le 100

考えたこと

まず第一関門は、円周率を文字列にしてしまう発想が浮かぶかどうか。できれば、"3." は除いて、小数部分のみを取り出した方が楽だろう。

1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

この文字列を  S とする。まず "3." を出力した上で、 S の先頭から  N 文字を出力すればよい。

方法 1

 S の先頭から  N 文字分を、for 文を使って出力する方法がまず考えられる。

for (int i = 0; i < N; ++i) cout << S[i];
cout << endl;

という感じだ。

方法 2

部分文字列を取り出す関数 substr() を使ってもよい。これを使うと文字列  S の先頭から  N 文字は S.substr(0, N) と書ける。

 

コード

方法 1

#include <bits/stdc++.h>
using namespace std;

int main() {
    string S = "1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679";
    int N;
    cin >> N;
    cout << "3.";
    for (int i = 0; i < N; ++i) cout << S[i];
    cout << endl;
}

方法 2

#include <bits/stdc++.h>
using namespace std;

int main() {
    string S = "1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679";
    int N;
    cin >> N;
    cout << "3." << S.substr(0, N) << endl;
}