打印沙漏

题目:本题要求你写个程序把给定的符号打印成沙漏的形状

 设计思路

    在写出几个高度不同的沙漏后不难发现 ,沙漏所需的字符数满足2n-1 (n为项数),输入的数必将大于或等于数列的其中一项,使用for循环找出其中的那一项。

    该题的关键是输出沙漏,找到输出空格和字符的规律并将其抽象为表达式。

  • 沙漏图形是一个对称图形
  • 每一项的行数为一个等差数列2n-1 //n为项数
  • 每行所输出的字符数&空格数与当前行距离对称轴的距离有直接关系
  • 输出空格数的关系为 dist - abs(dist-i) //dist为首行距离对称轴的距离,i为当前所在行
  • 输出字符数的关系为 2 * abs(dist-i)+1 //dist为首行距离对称轴的距离,i为当前所在行

本题调试过程碰到问题及解决办法

由于做题的时间距今已久,不能复现推导出 dist-i 的含义,如有成功复现者,请在评论区留言,谢谢。

 

运行结果

 

实验代码

#include <stdio.h>
#include <math.h>

int main(void)
{
  int num, n, num_diff, real_n,dist,
    i, j, x;
   char sign;
  scanf("%d %c",&num, &sign);

    for (n=0;n<1000;n++)
    {
        if ((2*(n*n)-1) > num)
            break;
      }

    real_n = n - 1; //真实需求项数

    num_diff = num - (2*(real_n*real_n)-1); //输入的数字与数列中某项的差v

    dist = real_n - 1;//dist 为首行距对称轴的距离

    //i计行 j计空格数 x计符号数
    for (i=0;i<((2*real_n)-1);i++)
    {

        for (j=0;j < dist - abs(dist-i);j++)
            printf(" ");
        for (x=0;x< 2 * abs(dist-i)+1;x++)
            printf("%c",sign);
        printf("\n");
    }

    printf("%d",num_diff);
    //printf("项数 %d     字符 %c     差%d",real_n, sign, num_diff);
    return 0;
}

 

posted @ 2019-02-20 15:08  harsonyoung  阅读(211)  评论(0)    收藏  举报