重啓c語言——打印沙漏

PTA第三題-打印沙漏

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

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

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

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

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

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

輸入樣例:
19 *

輸出樣例:

*****
 ***
  *
 ***
*****
2

思路:
首先需要確定的事打印最多符號時的總個數,然後求出剩餘沒有用到的個數,因爲沙漏總數與行數(這裏的行數爲上半部分或者下半部分)的關係爲sum=2ii-1;之後利用輸入的總數n減去sum即可得到餘數。如樣例中的19-233-1=2
此部分的代碼如下,可直接運

#include <stdio.h>
int main()
{
    int sum,yushu,hangshu,i,n,b;
    char fuhao;
    scanf("%d" "%c",&n,&fuhao);
    for(i=1;;i++)
    {
    	sum=2*i*i-1;
    	if(n<sum)
    	break;
    	b=sum;
	}
	yushu=n-b;
	hangshu=i-1;
	printf("%d",yushu);
}

之後先打印上半部分,再打印下半部分即可,這裏需要注意的一個問題就是中間對齊的時候,只需輸出符號前面的空格,符號後面的空格不要輸出,不然會報格式錯誤。直接換行即可。
最終程序如下所示

#include <stdio.h>
int main()
{
    int sum,yushu,hangshu,i,n,b,r;
    char fuhao;
    scanf("%d %c",&n,&fuhao);
    for(i=1;;i++)
    {
    	sum=2*i*i-1;
    	if(n<sum)
    	break;
    	b=sum;
	}
	yushu=n-b;
	hangshu=i-1;
	//打印上半部分 
	for(i=hangshu;i>0;i--)
	{
		for(r=hangshu-i;r>0;r--)
		printf(" ");
		for(r=1;r<=2*i-1;r++)
		printf("%c",fuhao);
		printf("\n");
	}
	//打印下半部分
	for(i=2;i<=hangshu;i++)
	{
		for(r=1;r<=hangshu-i;r++)
		printf(" ");
		for(r=1;r<=2*i-1;r++)
		printf("%c",fuhao);
		printf("\n");
	 } 
	printf("%d",yushu);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章