2017Final 圆周率山

为了参加学校的社团风采展,怡山小学数学组的同学们决定画一座圆周率山,以宣传圆周率。
已知圆周率为: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)的使用方法。

posted @ 2019-03-28 16:09  菜鸟plus  阅读(1825)  评论(0编辑  收藏  举报