PAT 1027打印沙漏
程序员文章站
2024-03-08 09:49:28
...
#include <stdio.h>
int emm(int n){
for(int i=1;i<=25;i++){
int xixi=(i+1)*(i+1)*2-1;
int haha=i*i*2-1;
if(n==haha||(n>haha&&n<xixi)){
return i;
}
}
return 0;
}
int yu(int n){
for(int i=1;i<=25;i++){
int xixi=(i+1)*(i+1)*2-1;
int haha=i*i*2-1;
if(n==haha||(n>haha&&n<xixi)){
return n-haha;
}
}
return 0;
}
int main(int argc, char const *argv[])
{
int a;
char ch;
scanf("%d %c",&a,&ch);
int e=emm(a);
//row
for(int i=1;i<=e;i++){
for(int j=1;j<=i-1;j++){
printf(" ");
}
for(int j=1;j<=2*e-1-2*(i-1);j++){
printf("%c",ch);
}
printf("\n");
}
for(int i=2;i<=e;i++){
for(int j=1;j<=e-i;j++){
printf(" ");
}
for(int j=1;j<=2*i-1;j++){
printf("%c",ch);
}
printf("\n");
}
int sheng=yu(a);
printf("%d\n",sheng);
return 0;
}
1.根据数列写出递推公式an-a(n-1)=2*(2n-1)
2.根据数列性质求得an=2n^2-1
3.emm函数用来找那个n,n的含义为沙漏最宽到最窄的行数,例如
7 5 3 1 3 5 7 n=4
5 3 1 3 5 n=3
4.复制emm函数稍加修改我们可以得到剩余没用完的符号
5.找到n就可以输出了,我是先输出n行,再输出后n-1行,注意空格的个数(与行数联系起来)和换行