为了参加学校的社团风采展,怡山小学数学组的同学们决定画一座圆周率山,以宣传圆周率。
已知圆周率为:3.
1415926535 8979323846 2643383279 5028841971 6939937510
5820974944 5923078164 0628620899 8628034825 3421170679
8214808651 3282306647 0938446095 5058223172 5359408128
4811174502 8410270193 8521105559 6446229489 5493038196
输入格式:
输入山的高度,为一个不超过10的正整数。
输出格式:
以上尖下宽,左右对称的三角形形式,给出圆周率的前若干位(不含小数点)。注意:每行均以数字结尾,即数字右边无空格。
输入样例1:
1
输出样例1:
3
输入样例2:
4
输出样例2:
3
141
59265
3589793
(摘自pintia.cn)
解答:
1 #include<iostream> 2 #include<string> 3 #include<iomanip> 4 #define PI "314159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196" 5 using namespace std; 6 int main() 7 { 8 string str(PI); //初始化字符串 9 int height,weight,mark(0); //height为高度,weight为底层的宽度,mark用于记录截取字符串的位置 10 cin>>height; //输入高度 11 weight=height*2-1; //计算底层宽度 12 string *p=new string[height]; //动态分配字符串组 13 for(int i(0);i<height;i++) //将字符串分层,每层有2*i+1个字符 14 { 15 *(p+i)=str.substr(mark,i*2+1); //sting.substr(unsigned int pos, unsigned int n) 从字符串sting的下标为pos的字符开始,截取n个字符 16 mark+=(i*2+1); 17 } 18 for(int i(0);i<height;i++) //分层输出 19 { 20 cout<<setw(weight/2+i+1)<<setfill(' ')<<*(p+i)<<endl; //每层占位wight/2+i+1个字符位,输出每层的字符串,其他的由空格填充 21 } 22 return 0; 23 }
解析:
见代码注释。
string.substr(unsigned int pos, unsigned int n)的使用方法。