基础c 语言 10:pta-打印沙漏

       本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

*****
 ***
  *
 ***
*****

        所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

        输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:

        首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:

19 *

输出样例:

*****
 ***
  *
 ***
*****
2

解题思路: 

  •  获取最多可以打印的行数;
  • 计算空格数,并打印;
  • 上下部分分开来打印。

程序源码:

#include   

int main() {
    int x, i = 0, sum = 0, it = 0, j = 0, x1;
    char c;

    // 读取输入的两个值:x1 和 c  
    scanf("%d %c", &x1, &c);

    // 将 x 的值减去 1 再除以 2 
    x = (x1 - 1) / 2;

    // 使用循环计算 sum 的值,从 3 开始每次加 2,直到 sum 大于等于 x  
    for (i = 3; sum < x; i += 2) {
        sum += i;
    }

    // 从当前值 i 中减去 4,得到一个新的值  
    i = i - 2;

    // 打印上半部分  
    for (it = i; it > 1; it -= 2) {
        // 计算当前行前面的空格数量  
        j = (i - it) / 2;
        while (j--) {
            printf(" ");
        }
        // 计算当前行的字符数量  
        j = it;
        while (j--) {
            printf("%c", c);
        }
        printf("\n");
    }

    // 打印下半部分  
    for (it = 1; it <= i; it += 2) {
        // 计算当前行前面的空格数量  
        j = (i - it) / 2;
        while (j--) {
            printf(" ");
        }
        // 计算当前行的字符数量  
        j = it;
        while (j--) {
            printf("%c", c);
        }
        printf("\n");
    }

    // 打印最后一个数字的值,即 x1 减去使用组成图形剩下的图形个数 
    printf("%d\n", x1 - (sum * 2 + 1));

    return 0;
}

程序详解:

         导入头文件,定义变量之内不再多做所需解释

cf067b9e110a4178b16ffed1f72fa6c2.png

        该图形是上下对称的图形,所以我们直接获取符号一半来尝试组成半个图形,然后半个部分,半个部分的输出,-1的原因是我们需要去除中位的符号,该符号保持不变,所以我们不需要计算,同时符号总数需要减去它,预留它。

基础c 语言 10:pta-打印沙漏_第1张图片

         这里我们主要是计算出一半能组成的最大图形,因为规律是半个图形的第二行等于三,从中间往两边扩散时,是一个等差数列,也就是每一行符号正好是上一行的符号+2,我们通过这样的方法得到半个图形中最大行的符号个数。最终sum是一半的符号个数不包含中间单独一个。

92f372234a324937b768ddb971b13da4.png

         减去一个2,得到第一行和最后一行的值。因为当不满足条件是说明上一行是最大行数,所以需要减去2,得到上一行的值.

基础c 语言 10:pta-打印沙漏_第2张图片

        打印上半部分时,第一次给j赋值我们通过了解空格的规律,可以得到它和当前字符数息息相关,正好等于(最大行数符号个数-当前行数符号个数)/2。

        第二次则是输出当前符号的个数即可。

基础c 语言 10:pta-打印沙漏_第3张图片

        打印下半部分 则是累加符号个数,空格数方法也是采用上半部分相同来计算.

d086686dc072440aa8cdb6a521d13234.png

        其中sum是我们对于打赢半个图形所需要的的符号(不包含中间单独的一个),所以我们只需要通过输入的符号数-(半个图形所需符号*2+1)即可得到还剩余多少个符号输出即可。 

你可能感兴趣的:(c,c语言)