团体程序设计天梯赛PTA L1-002打印沙漏

题意:通过给定的字符数和字符打印最大沙漏形状,并且在最后一行中输出剩下没用掉的符号数。

解题思路:计算最大层数,用类似打印菱形的方法进行打印。需要注意的是,只打印前半部分的空格,后半部分空格打印会被判格式错误。

第一次用模拟的方法进行打印。缺点:代码较长,不好维护,容易出错。

#include<stdio.h>
#include<math.h>
int main()
{
    int n,x,y,i,j,k;
    char a;
    scanf("%d",&n);
    getchar();
    scanf("%c",&a);
    x=sqrt((n+1)/2);
    i=x;
    j=x;
    k=x;
    while(x!=0)
    {
        y=x*2-1;
        if(i==x)
        {
            while(y--)
            {
                printf("%c",a);
            }
            printf("
");
        }
        else
        {
            i=j-x;
            while(i--)
                printf(" ");
            while(y--)
            {
                printf("%c",a);
            }
            printf("
");
        }
        x--;
    }
    i=2;
    x=2;
    while(x<=j)
    {
        y=2*x-1;
        if(j==x)
        {
            while(y--)
            {
                printf("%c",a);
            }
            printf("
");
        }
        else
        {
            i=j-x;
            while(i--)
                printf(" ");
            while(y--)
            {
                printf("%c",a);
            }
            printf("
");
        }
        x++;
    }
    printf("%d",n-(2*k*k-1));
    return 0;
}
View Code

第二次用几何方法进行打印,把整个图形看成一个整体,算出层数(x)后可设置两层循环从-x到x,分别代表行数和层数。

 1 #include <iostream>
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int n,x,y,k;
 8     char a;
 9     scanf("%d",&n);
10     getchar();
11     scanf("%c",&a);
12     x=sqrt((n+1)/2);//计算层数
13     x --;//最中间那层是第0层
14     for(int i = -x; i <= x; i++)
15     {
16         for(int j = -x; j <= x; j++)
17         {
18             if(abs(j)<=abs(i))//如果列大于行的序号,就打印该给定字符
19                 putchar(a);
20             else if(abs(j)>abs(i) && j < 0)//空格只能输出前半部分,全部输出会报格式错误
21                 putchar(' ');
22         }
23         putchar('
');
24     }
25     //输出剩余未用的字符数,可以通过这个公式反推前面的计算层数的公式。
26     printf("%d
",n-(2*x*x+4*x+1));
27     
28     return 0;
29 }
原文地址:https://www.cnblogs.com/dark-ming/p/13600819.html