打印沙漏
设计思路
在写出几个高度不同的沙漏后不难发现 ,沙漏所需的字符数满足2n2 -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; }

浙公网安备 33010602011771号