打印沙漏
一、题目:
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,
再从小到大顺序递增;首尾符号数相等。给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
二、输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
三、输入样例:
19 *
四、输出样例:
***** *** * *** ***** 2
五、设计思路:
为了方便叙述,我先假设用户需要打印的符号的个数为N,需要打印的符号是*;
1,首先我们通过观察该图案,利用等差数列的求和公式可以得到一个规律:第n个图案所包含*的个数为2n2-1个;
2,然后根据用户输入的N来判断最多可以打印第几个完整图案,例如,如果用户输入19,那么令2n2-1=19,n就约等于3,
也就是说最多可以打印出第三个图案的所有*;
3,将我们第二步得到的n代入到2n2-1中,计算出来刚好打印完图案所需要的*的个数,
也就是说如果用户输入19,那么最多可以打印出第三个图案的所有*,打印该图案所需符号的个数为2*32 - 1=17;
4,最后将用户输入的N减去第三步计算出的2n2-1,可以得到打印完后多出来*的个数,即最后多出符号的个数为:N-(2n2-1),
如果用户输入19,那么最多可以打印出第三个图案的所有*,打印该图案所需符号的个数为2*32 - 1=17,
最后多出来的*个数为19-17=2;
5,至于打印出图案的具体代码就是通过三层循环嵌套来实现的,第一层控制打印行数,第二层控制打印控制打印空格数,第三层控制打印符号的个数。
六、完整代码:
#include<stdio.h> #include<math.h> int main() { int number; char ch; int n; int i,j,k; scanf("%d %c",&number,&ch); //通过观察我们可以知道第n个图案,需要打印的符号个数为2*n*n-1; //2*n*n-1=number ==> n = sqrt((number+1)/2) n = sqrt((number+1)/2); //判断最后多出来的图案的个数 int res = number - (2*n*n-1); //打印倒三角图案 //控制打印行数 for (i = n; i >= 1; i--) { //控制每行前空格数 for (k = 1; k <= n-i; k++) { printf(" "); } //控制每图案的个数 for (j = 1; j <= 2*i-1; j++) { printf("%c",ch); } printf("\n"); } //打印正三角图案 //控制打印行数 for (i = 2; i <= n; i++) { //控制每行前空格数 for (k = 1; k <= n-i; k++) { printf(" "); } //控制每图案的个数 for (j = 1; j <= 2*i-1; j++) { printf("%c",ch); } printf("\n"); } printf("%d\n",res); // system("pause"); // getch(); return 0; }
七、打印效果:
作者:陈太浪
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。