题目描述
打印出一个底部有n个*的漏斗
输入
第一行输入一个T;表示有T组测试数据
下面每一行都有一个n表示漏斗底部*的个数
n保证是奇数
输出
输出打印结果
两个测试答案之间要用换行分割
输入样例1
3
11
13
15
输出样例1
***********
*********
*******
*****
***
*
***
*****
*******
*********
***********
*************
***********
*********
*******
*****
***
*
***
*****
*******
*********
***********
*************
***************
*************
***********
*********
*******
*****
***
*
***
*****
*******
*********
***********
*************
***************
先上代码
#include <stdio.h>
int main()
{
int n,T;
scanf("%d\n",&T);
int star,k;
while(T--)
{
scanf("%d",&n);
star=n;
for(int i=n/2;i>=1;i--)
{
int j=(n-star)/2;
while(j!=0)
{
printf(" ");
j--;
}
for(int j=1;j<=star;j++)
printf("*");
printf("\n");
star-=2;
}//输出上半部分
star=1;
for(int i=0;i<=n/2;i++)
{
int j=(n-star)/2;
while(j!=0)
{
printf(" ");
j--;
}
for(int j=1;j<=star;j++)
printf("*");
printf("\n");
star+=2;
}//输出下半部分
printf("\n");//输出完换行
}
return 0;
}
一段一段解释
star=n;//第一行*的个数
for(int i=n/2;i>=1;i--)
{
int j=(n-star)/2;//只输出左侧的空格
while(j!=0)
{
printf(" ");
j--;
}
for(int j=1;j<=star;j++)
printf("*");
printf("\n");
star-=2; //虽然空格只输出左边,但是*是正常两侧对称,减少两个的
}//输出上半部分
定义i=n/2是行数,即上半部分(除了只有单个*的那行)的行数,因为不能上下都输出一个*所以删去一行,当然你也可以把下半部分的删去
下半段同理
输出一个漏斗之后换行
要分享的大概就这些,如果有更好的方法欢迎交流!
如果有帮到你请点个赞吧!也可以关注我,以后会分享更多,谢谢!
(专栏里面还有更多题哦)

被折叠的 条评论
为什么被折叠?



