题目描述
输入一个正整数 n,并输出一个沙漏形,这个沙漏形有 2n+1 行,第一行有 2n+1 个字母,其中前 n+1 个字符是从 A 开始依次递增的,而后 n 个字符是由第 n+1 个字符开始依次递减的。之后的 n 行每行会少头尾两个字母。再之后的 n 行则正好是前 n 行反过来输出的结果。注意末尾不要有多余的输出。
输入
输入一个正整数 n。(0
按照样例输出。
样例输入
2
样例输出
ABCBA
BCB
C
BCB
ABCBA
样例输入2
3
样例输出2
ABCDCBA
BCDCB
CDC
D
CDC
BCDCB
ABCDCBA
数据规模与约定
时间限制:1 s
内存限制:256 M
100% 的数据保证 0
这道OJ题还是花了很长时间来完成的,那么为了后续在回忆时有个依照,也为看到这道题同样没有思路的朋友,提供个思路。
思路如下:
1.判断输出的行数
for(int i=0;i<(2*n+1);i++);
2.输出字母前如何空格:
//对是否要输出空格做判定
e=i<(n+1)?i:--e;
k=e;
while(k){
printf(" ");
k--;
}
3.沙漏上半部分
if(i<=n){
//沙漏上半部分
//对每行输出多少字母做判定
for(int j=0;j<2*abs(n-i)+1;j++){
//对每行输出递增字母做判断
printf("%c",c+'A');
if(j<abs(n-i)){
++c;
}else{
--c;
}
}
printf("\n");
if(i != n)
c+=2;
}
4.沙漏下半部分
//对每行输出多少字母做判定
for(int j=0;j<2*abs(n-i)+1;j++){
//对每行输出递增字母做判断
printf("%c",c+'A');
if(j<abs(n-i)){
++c;
}else{
--c;
}
}
printf("\n");
完整代码:
#include<stdio.h>
int abs(int n){
if(n<0)
return -n;
}
int main(){
int n=0,c=0,e=0,k=0;
scanf("%d",&n);
for(int i=0;i<(2*n+1);i++){//输出的行数
//对是否要输出空格做判定
e=i<(n+1)?i:--e;
k=e;
while(k){
printf(" ");
k--;
}
if(i<=n){//沙漏上半部分
//对每行输出多少字母做判定
for(int j=0;j<2*abs(n-i)+1;j++){
//对每行输出递增字母做判断
printf("%c",c+'A');
if(j<abs(n-i)){
++c;
}else{
--c;
}
}
printf("\n");
if(i != n)
c+=2;
}else{//沙漏下半部分
//对每行输出多少字母做判定
for(int j=0;j<2*abs(n-i)+1;j++){
//对每行输出递增字母做判断
printf("%c",c+'A');
if(j<abs(n-i)){
++c;
}else{
--c;
}
}
printf("\n");
}
}
return 0;
}