团体程序设计天梯赛PTA L1-002打印沙漏
题意:通过给定的字符数和字符打印最大沙漏形状,并且在最后一行中输出剩下没用掉的符号数。
解题思路:计算最大层数,用类似打印菱形的方法进行打印。需要注意的是,只打印前半部分的空格,后半部分空格打印会被判格式错误。
第一次用模拟的方法进行打印。缺点:代码较长,不好维护,容易出错。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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("\n"); } else { i=j-x; while(i--) printf(" "); while(y--) { printf("%c",a); } printf("\n"); } x--; } i=2; x=2; while(x<=j) { y=2*x-1; if(j==x) { while(y--) { printf("%c",a); } printf("\n"); } else { i=j-x; while(i--) printf(" "); while(y--) { printf("%c",a); } printf("\n"); } x++; } printf("%d",n-(2*k*k-1)); return 0; }
第二次用几何方法进行打印,把整个图形看成一个整体,算出层数(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('\n'); 24 } 25 //输出剩余未用的字符数,可以通过这个公式反推前面的计算层数的公式。 26 printf("%d\n",n-(2*x*x+4*x+1)); 27 28 return 0; 29 }