本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
解题思路:
/*
解题思路:
1)使用scanf函数接收符号数N和符号
2)因为是关于某一行(仅1个符号)对称:
total = 1;
i = 3;
while(total <= N) {
total += (2 * i);
i += 2;
}
// 输出的i - 2就是最后一行符号的个数,total - 2 * i 便是用的符号数
*/
代码:
# include <stdio.h>
int main() {
int N,total = 1,i = 3,j,k = 0,z = 0;
char st;
// 传入两个参数
scanf("%d %c",&N,&st);
while (total <= N) {
total += (2 * i);
i += 2;
}
// 用到的符号数,以及最后的i大小
i -= 2;
total -= 2*i;
i -= 2;
// 先开始倒着输出 ,空格数逐行加1
for(j = i;j >= 1;j -= 2) {
for(z = 0;z < k;z++) {
printf(" ");
}
for(z = 0;z < j;z++) {
printf("%c",st);
}
k += 1;
printf("\n");
}
// 现在开始正着输出,一个符号的行的空格数是:(j - 1) / 2个
k -= 2;
for(j = 3;j <= i;j += 2) {
for(z = 0;z < k;z++) {
printf(" ");
}
for(z = 0;z < j;z++) {
printf("%c",st);
}
k -= 1;
printf("\n");
}
printf("%d",N - total);
return 0;
}