思路:找规律,找到沙漏从只有1个的那层到最多的那层一共有:2*i*i-1。于是,输入n之后,遍历找到i,即沙漏的一半层数,记为col。然后根据每行的空格和符号规律,对应输出。

代码:

#include<cstdio>
int main(){
	int n,col,left;
	char sign;
	scanf("%d %c",&n,&sign);
	for(int i = 1;;i ++){
		if(2*i*i-1 > n){
			col = i - 1;  //找出沙漏一半的行数
			left = n - 2*col*col+1;  //剩余没有用的符号数
			break;
		}
	}
	//打印上半层
	for(int i = 0;i < col;i ++){
		for(int j = i;j > 0;j --){
			printf(" ");
		}
		for(int k = 2*col-1 - 2*i;k > 0;k --){
			printf("%c",sign);
		}
		printf("\n");
	}
	//打印下半层
	for(int i = col-1;i > 0;i --){
		for(int j = i;j > 1;j --){
			printf(" ");
		}
		for(int k = 2*i-1;k <= 2*col-1;k ++){
			printf("%c",sign);
		}
		printf("\n");
	}
	printf("%d\n",left);
	return 0;
}

 版权声明:本文为博主原创文章,未经博主允许不得转载。