2

我正在尝试用 C 语言编写一个程序,该程序给出一个 13 行的金字塔,输出如下(注意字母的模式,即 BCB):

            A
           BCB
          DEFED
         GHIJIHG
        KLMNONMLK
       PQRSTUTSRQP
      VWXYZABAZYXWV
     CDEFGHIJIHGFEDC
    KLMNOPQRSRQPONMLK
   TUVWXYZABCBAZYXWVUT
  DEFGHIJKLMNMLKJIHGFED
 OPQRSTUVWXYZYXWVUTSRQPO
ABCDEFGHIJKLMLKJIHGFEDCBA

这是我对解决方案的尝试:

#include <stdio.h>
#include <stdlib.h>


int main(void){

    char c = 'A';
    int height = 13;
    int max = 1;
    for (int i = 1; i <= height; i++){
        //int j = 1;
        for (int k = 0; k < height - i; k++) 
            printf(" "); // print space on left
        for (int j = 1; j <= max; j++){ 
            if (j <= max / 2){ // print left side of pyramid 
                printf ("%c", c);
                c = (c - 'A' + 1) % 26 + 'A';
            }
            else{ // print right side of pyramid 
            printf ("%c", c);
            c = (c -'A' + 25) % 26 + 'A';
            }
        }
        printf("\n");
        max += 2;
    }

}

但是它给出了以下不正确的输出:

            A
           ZAZ
          YZAZY
         XYZAZYX
        WXYZAZYXW
       VWXYZAZYXWV
      UVWXYZAZYXWVU
     TUVWXYZAZYXWVUT
    STUVWXYZAZYXWVUTS
   RSTUVWXYZAZYXWVUTSR
  QRSTUVWXYZAZYXWVUTSRQ
 PQRSTUVWXYZAZYXWVUTSRQP
OPQRSTUVWXYZAZYXWVUTSRQPO

如果我删除if/else将金字塔分成两侧的语句并且只有c = (c - 'A' + 1) % 26 + 'A';,我会得到以下输出:

            A
           BCD
          EFGHI
         JKLMNOP
        QRSTUVWXY
       ZABCDEFGHIJ
      KLMNOPQRSTUVW
     XYZABCDEFGHIJKL
    MNOPQRSTUVWXYZABC
   DEFGHIJKLMNOPQRSTUV
  WXYZABCDEFGHIJKLMNOPQ
 RSTUVWXYZABCDEFGHIJKLMN
OPQRSTUVWXYZABCDEFGHIJKLM

有任何想法吗?

4

2 回答 2

6

问题是您忘记增加实际的整体角色。对于每一行,您都需要添加字符,直到达到您应该从下一行开始的值。幸运的是,这很容易做到:

    ...
    max += 2;
    c = (c - 'A' + max / 2 + 1) % 26 + 'A'; // Add this line
}
于 2013-05-04T04:04:13.967 回答
1

这是一个简短的版本:

#include <stdio.h>

#define HEIGHT 6

int main(void) {
    char* f = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char* b = "ZYXWVUTSRQPONMLKJIHGFEDCBA";
    int c = 0;

    for(int i=0; i<HEIGHT; ++i)
    {
        printf("%*.*s%.*s\n", 10, i+1, f+i+c, i, b+strlen(b)-(c+2*i));
        c+=i;
    }
    return 0;
}

IDEOne 链接

输出:

Success #stdin #stdout 0s 9424KB
         A
        BCB
       DEFED
      GHIJIHG
     KLMNONMLK
    PQRSTUTSRQP
于 2018-12-23T14:14:42.240 回答