题目描述
输入一个正整数 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;}
