7-82 打印沙漏
分数 20
全屏浏览题目
切换布局
作者 陈越
单位 浙江大学
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB /本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“”,要求按下列格式打印
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
int main()
{
int n;
char a;
scanf("%d %c",&n,&a);
int cnt=0;
int sp1=1;//上半部分的空格
int first=1;//第一行的个数
int sum=1;
while (sum<n)
{
first+=2;
sum+=first*2;
//判断要有多少个*
}
if(sum>n)
first-=2;
for(int i=first;i>2;i-=2){
if(i!=first){
printf("%*s",sp1," ");
sp1++;
}
for(int j=i;j>0;j--){
printf("%c",a);
cnt++;
}
printf("\n");
```js
}
if(n<=6){
printf("%c\n",a);
cnt++;
}
else{
printf("%*s",sp1," ");
printf("%c\n",a);
cnt++;
}
int sp2=--sp1;//下半部分的空格
for(int i=3;i<=first;i+=2){
if(i!=first){
printf("%*s",sp2," ");
sp2--;
}
for(int j=i;j>0;j--){
printf("%c",a);
cnt++;
}
printf("\n");
}
printf("%d",n-cnt);
return 0;
} `` 这两题说实话是比较像的,只是输出的方式有所不同。只要注意分别把上下部分的空格和*的个数算出来 然后在打印就非常容易解出来。
7-59 打印菱形图案
分数 15
全屏浏览题目
切换布局
作者 C课程组
单位 浙江大学
本题要求编写程序,打印一个高度为n的、由“*”组成的正菱形图案。
输入格式:
输入在一行中给出一个正的奇数n。
输出格式:
输出由n行星号“*”组成的菱形,如样例所示。每个星号后跟一个空格。
输入样例:
7
输出样例:
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
int main()
{
int n;
scanf("%d",&n);
int m2=2,m1=n-1;//空格数,m1为上半部分,m2为下半部分
int z2=n-2,z1=1;//*数,z1为上半部分,z2为下半部分
for(int i=1;i<=n/2;i++){
for(int j=1;j<=m1;j++){
printf(" ");//打印每轮的空格
}
for(int j=1;j<=z1;j++)
{
printf("* ");
}
printf("\n");
z1+=2;//每轮空格-2,*+2
m1-=2;
}
for(int i=1;i<=n;i++){
if(i==n)
printf("* \n");
else printf("* ");
}
for(int i=1;i<=n/2;i++){
for(int j=1;j<=m2;j++){
printf(" ");
}
for(int j=1;j<=z2;j++)
{
printf("* ");
}
printf("\n");
m2+=2;
z2-=2;
}
return 0;
}