问题 B: 字母圣诞树
题目描述
打印一个字母圣诞树。
输入
多组样例,第一行为样例的个数,接下来每个样例是一个大写英文字母,占一行。
输出
输出对应的字母圣诞树,每行末尾没有空格,每个圣诞树的最后一行前无空格。
样例输入
3
A
B
C
样例输出
A
AAA
A
AAA
B
BBBBB
A
AAA
B
BBBBB
C
CCCCCCC
这个题目其实一开始能看出来一些端倪
所以通过看题我们可以知道,我们需要的是你输入的那个字母输出时的第二行要顶格,因此通过计算我们可以知道以下内容:
输入A,那么第一行就只有一个空格
输入B,那么第一行就只有两个空格
所以第一行空格数等于你输入的字母的ASCII码减去‘A’的ASCII码
第二行输出的内容也可以根据找规律找出
输入A,无空格
输入B,A一个空格,B无空格
输入C,A两个空格,B一个空格,C无空格…
而且每一个字母输出的第二行的数量时有限的,比如说A—3,B—5,C—7,其实就是减去‘A’对应的ASCII码加上一乘以二再加一
(需要多个for循环来输出,避免出错)
因此,AC代码如下:
#include <stdio.h>
int main(void){
int n,m,i,j,y;
//都是为了for循环而定义的字母
char x;
while(~scanf("%d",&n)){
while(n--){
scanf(" %c",&x);
//前面带了个空格,防止换行符造成影响
for(i=0;i<x-'A'+1;i++){
//这个i其实就是用来控制输出字符('A'+i)
for(m=0;m<x-'A'+1;m++){
printf(" ");
}//这个地方是用来输出第一行的空格的
printf("%c\n",'A'+i);
//这个地方是用来输出第一行的字母的(记得换行)
for(j=0;j<2*(x-'A'+1)+1;j++){
if(j+i+'A'<x)//这个控制条件是j+i+'A'<x(不懂的话可以在评论区讨论一下)
printf(" ");
//这个当然负责第二行的空格啦
}
for(y=0;y<2*(i+1)+1;y++) printf("%c",'A'+i);
//其实和上面说的题目解析一致,3,5,7...(输出A的时候i==0;B的时候i==1...
putchar('\n');
//记得换行哦,亲
}
}
}
return 0;
}
仅供参考,不希望同学们拿来完成任务