PTA打印沙漏。如何打印出想要的沙漏

347 阅读3分钟

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;

}