自测-1 打印沙漏 (20 分)

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定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;
} 

提交截图:

猜你喜欢

转载自blog.csdn.net/weixin_43862765/article/details/115365135