代码
#include <iostream>
using namespace std;
int main(){
int n;
char c;
cin>>n>>c;
int sum = 1;
int lastSum = 1;
int pos = 1;
int tmp = 3;
while(n>=sum){
lastSum = sum;
sum += tmp*2;
tmp += 2;
pos++;
}
int remain = n - lastSum;
if(pos>1){
pos--;
}
int max = pos;
int width = 2*pos-1;
while(pos>0){
int nowLine = 2*pos-1;
for(int i=0; i<(width-nowLine)/2; i++){
cout<<" ";
}
for(int i=0; i<nowLine; i++){
cout<<c;
}
cout<<endl;
pos--;
}
pos+=2;
while(pos<=max){
int nowLine = 2*pos-1;
for(int i=0; i<(width-nowLine)/2; i++){
cout<<" ";
}
for(int i=0; i<nowLine; i++){
cout<<c;
}
cout<<endl;
pos++;
}
cout<<remain<<endl;
return 0;
}
注解
1、先找出来与输入最接近的符合题意的个数。
找的方法有两种:
(1)像该代码这种找法,每次手动找。
(2)如有多组输入,需要多次查找太耗时,可采用打表法,事先把该数组的内容计算出来,打表。这样节约时间!
/*
int a[] = {0, 1, 7, 17, 31, 49, 71, 97, 127, 161, 199, 241, 287, 337, 391, 449, 511, 577, 647, 721, 799, 881, 967, 1057};
int len = sizeof(a)/sizeof(a[0]);
int remain;
int pos;
for(int i=0; i<len-1; i++){
if(a[i]<=n && a[i+1]>n){
remain = n - a[i];
pos = i;
break;
}
}*/
2、此题有个小坑点,就是行末不能有多余空格,也就是,开头是一堆空格,然后是沙漏字符,就结束了!不能再添加一些空格在行尾。否则会有2个case是Wrong Answer!
每行字符的个数是2*pos-1,空格的个数就是width减字符的个数,再除以2(左右对称)
3、学到的语法:
数组长度用sizeof计算:int len = sizeof(a)/sizeof(a[0]);