為了參加學校的社團風采展,怡山小學數學組的同學們決定畫一座圓周率山,以宣傳圓周率。
已知圓周率為: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)的使用方法。