1. 程式人生 > >B1027 列印沙漏

B1027 列印沙漏

本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個“*”,要求按下列格式列印

*****
 ***
  *
 ***
*****

所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。

給定任意N個符號,不一定能正好組成一個沙漏。要求打印出的沙漏能用掉儘可能多的符號。

輸入格式:

輸入在一行給出1個正整數N(≤1000)和一個符號,中間以空格分隔。

輸出格式:

首先打印出由給定符號組成的最大的沙漏形狀,最後在一行中輸出剩下沒用掉的符號數。

輸入樣例:

19 *

輸出樣例:

*****
 ***
  *
 ***
*****
2
#include<stdio.h>
int p;
int init(int n){
	int sum=0,i;
	for(i=1;i<=n;i++){
		if(i==1)sum=1;
		else sum+=(2*i-1)*2;
		if(sum>n)break;
	}
	p=sum-(2*i-1)*2;
	return i-1;
}
int main(){
	int n,local=0;
	char str;
	scanf("%d",&n);getchar();
	scanf("%c",&str);
	for(int i=init(n)-1;i>0;i--){//i=2,1;
		for(int k=0;k<init(n)-i-1;k++){
			printf(" ");
		}
		local=init(n)-i;
		for(int j=0;j<1+2*i;j++){
			 printf("%c",str);
		}
		printf("\n");
	}
	for(int i=0;i<local;i++){printf(" ");}
	if(n!=0) printf("%c\n",str);
	for(int i=1;i<=init(n)-1;i++){
		for(int k=init(n)-i-2;k>=0;k--){
			printf(" ");
		}
		for(int j=0;j<1+2*i;j++){
			 printf("%c",str);
		}
		printf("\n");
	}
	if((n-p!=0)&&n!=1&&n!=0)	printf("%d",n-p);
	else if(n==1)printf("0");
}

注意:可分三塊輸出 上一片 中間 下一片

在n==1的時候需要輸出最後的結果還有0個特判一下 否則有一個測試點過不了