睡醒后,想拿道题醒醒脑子,没想到这一道题就花了1个多小时,这个格式坑死了。
原因分析:要输出空格的行,只在输出字符前填充到中心对齐就好了,不需要在后面继续输出空格。
错误的代码:
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
int main(){
int sum;
char p;
cin >> sum >> p;
int n = 1;
while(sum >= (2*n * n - 1)){
n++;
}
if(n != 1)
n--;
int temp = n;
while(temp != 0){
for(int i = 0; i < (2*n - 2*temp)/2; i++)
cout << ' ';
for(int i = 0; i < (2*temp - 1); i++)
cout << p;
for(int i = 0; i < (2*n - 2*temp)/2; i++)//出错的地方,输出字符后继续输出了空格
cout << ' ';
cout << endl;
temp--;
}
int contr = 2;
while(contr <= n){
for(int i = 0; i < (2*n - 2*contr)/2; i++)
cout << ' ';
for(int i = 0; i < (2*contr - 1); i++)
cout << p;
for(int i = 0; i < (2*n - 2*contr)/2; i++)//出错的地方,输出字符后继续输出了空格
cout << ' ';
cout << endl;
contr++;
}
cout << sum - (2*n * n - 1);
return 0;
}
修改后:
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
int main(){
int sum;
char p;
cin >> sum >> p;
int n = 1;
while(sum >= (2*n * n - 1)){
n++;
}
if(n != 1)
n--;
int temp = n;
while(temp != 0){
for(int i = 0; i < (2*n - 2*temp)/2; i++)
cout << ' ';
for(int i = 0; i < (2*temp - 1); i++)
cout << p;
cout << endl;
temp--;
}
int contr = 2;
while(contr <= n){
for(int i = 0; i < (2*n - 2*contr)/2; i++)
cout << ' ';
for(int i = 0; i < (2*contr - 1); i++)
cout << p;
cout << endl;
contr++;
}
cout << sum - (2*n * n - 1);
return 0;
}
结果: