Logo 期许www的博客

博客

新博客

2021-12-29 14:07:04 By 期许www

141. 输出字母沙漏

题目描述 ​ 输入一个正整数 n,并输出一个沙漏形,这个沙漏形有 2n+1 行,第一行有 2n+1 个字母,其中前 n+1 个字符是从 A 开始依次递增的,而后 n 个字符是由第 n+1 个字符开始依次递减的。之后的 n 行每行会少头尾两个字母。再之后的 n 行则正好是前 n 行反过来输出的结果。注意末尾不要有多余的输出。

输入 ​ 输入一个正整数 n。(0<n<26) 输出 ​ 按照样例输出。

样例输入 2 样例输出 ABCBA BCB C BCB ABCBA 样例输入2 3 样例输出2 ABCDCBA BCDCB CDC D CDC BCDCB ABCDCBA 数据规模与约定 ​ 时间限制:1 s

​ 内存限制:256 M

​ 100% 的数据保证 0<n<26 入门组循环字符

这道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 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; }

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。