1 条题解

  • 0
    @ 2026-6-19 10:30:38

    📝 题目大意

    给定一个整数 NN1N1001 \le N \le 100),输出圆周率 π\pi 在小数点后保留 NN 位的值(即在小数第 N+1N+1 位截断),末尾的 0 需要保留,不能省略。

    💡 解题思路

    1. 题目分析:题目直接给出了 π\pi 小数点后 100100 位的完整字符串,NN 最大也只有 100100。因此不需要任何数学计算,只需要从给定的字符串中截取前 N+2N+2 个字符(即 "3." + NN 位小数)输出即可。

    2. 算法推导

      • π\pi 的完整字符串存储为常量 a,其中 a[0]='3'a[1]='.',从 a[2] 开始是 100100 位小数数字。
      • 读入 NN 后,先输出 "3.",然后依次输出 NN 个小数位字符,即 a[2]a[N+1]
      • std.cpp 中,通过循环 for (int i = 1; i <= n; i++) 输出 a[i+1],等价于从下标 22 开始输出 NN 个字符。
    3. 边界与细节

      • NN 的取值范围是 11100100,因此 "3." 一定会被输出。std.cpp 中额外处理了 N=0N=0 的情况(单独输出 "3"),属于防御性编程,实际不会出现。
      • 题目强调不要去除末尾的 0,例如 N=32N=32 时,输出末尾是 ...950,其中的 0 必须保留——直接按字符串截取即可自然满足此要求。

    ⏱️ 复杂度分析

    • 时间复杂度O(N)O(N),最多输出 102102 个字符,实际上 N100N \le 100
    • 空间复杂度O(1)O(1),仅使用一个常量字符串和几个变量。

    💻 标准代码 (C++)

    #include <bits/stdc++.h>
    using namespace std;
    int main(){
        int n;
        // 圆周率小数点后100位的完整字符串(含"3."前缀)
        string a="3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679";
        cin >> n;
        // 防御性处理:N=0时只输出整数部分"3"(题目约束N>=1,此分支不会触发)
        if(n == 0){
            cout << "3";
            return 1;
        }
        if(n >= 1){
            cout << "3.";               // 先输出整数部分和小数点
            // 从下标2开始(即第一个小数位),依次输出N个小数位字符
            for(int i = 1; i <= n; i++){
                cout << a[i + 1];
            }
        }
        return 0;
    }
    
    • 1

    信息

    ID
    733
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者