#include #include #include #include // リープニッツの公式で円周率を小数点以下まで計算 std::string calculatePi(int precision) { // 分母が奇数になることを利用します long double pi = 0.0; long long k = 0; for (long long i = 0; i < precision * 10; ++i) { pi += (i % 2 == 0 ? 1.0 : -1.0) / (2.0 * k + 1.0); k++; } pi *= 4.0; // リープニッツの公式では π/4 を求めるので、4 を掛けることで π を得ます。 // 小数部分を取得する文字列加工 std::ostringstream oss; oss.precision(precision + 10); // 精度を指定(誤差調整用に多め) oss << std::fixed << pi; // 整数部分("3.")を除外 std::string piStr = oss.str(); size_t dotIndex = piStr.find('.'); if (dotIndex != std::string::npos) { return piStr.substr(dotIndex + 1); } return ""; } int main() { const std::string TARGET = "20240401"; // 探す文字列 const int PRECISION = 100000; // 円周率の計算桁数 // 円周率を計算して文字列として取得 std::string piDecimal = calculatePi(PRECISION); // ターゲット文字列を検索 size_t position = piDecimal.find(TARGET); if (position != std::string::npos) { // 見つかった場合、位置を1加算して出力(1始まり) std::cout << position + 1 << std::endl; } else { // 見つからない場合は -1 を出力 std::cout << -1 << std::endl; } return 0; }