1 条题解
-
0
📝 题目大意
给定一个整数 (),输出圆周率 在小数点后保留 位的值(即在小数第 位截断),末尾的
0需要保留,不能省略。💡 解题思路
-
题目分析:题目直接给出了 小数点后 位的完整字符串, 最大也只有 。因此不需要任何数学计算,只需要从给定的字符串中截取前 个字符(即
"3."+ 位小数)输出即可。 -
算法推导:
- 将 的完整字符串存储为常量
a,其中a[0]='3',a[1]='.',从a[2]开始是 位小数数字。 - 读入 后,先输出
"3.",然后依次输出 个小数位字符,即a[2]到a[N+1]。 - 在
std.cpp中,通过循环for (int i = 1; i <= n; i++)输出a[i+1],等价于从下标 开始输出 个字符。
- 将 的完整字符串存储为常量
-
边界与细节:
- 的取值范围是 到 ,因此
"3."一定会被输出。std.cpp中额外处理了 的情况(单独输出"3"),属于防御性编程,实际不会出现。 - 题目强调不要去除末尾的
0,例如 时,输出末尾是...950,其中的0必须保留——直接按字符串截取即可自然满足此要求。
- 的取值范围是 到 ,因此
⏱️ 复杂度分析
- 时间复杂度:,最多输出 个字符,实际上 。
- 空间复杂度:,仅使用一个常量字符串和几个变量。
💻 标准代码 (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
- 上传者