PAT B1036:跟奥巴马一起编程
思路:按要求输入即可,注意要求(宽度=长度/2,四舍五入),先判断长度是否为偶数,若不是/2后+1;
#include <cstdio> int main(){ int n,temp; char a; scanf("%d %c",&n,&a); if(n%2==0) temp=n/2; else temp=n/2+1; for(int i=0;i<n;i++){ printf("%c",a); if(i==n-1) printf("\n"); } for(int i=0;i<temp-2;i++){ printf("%c",a); for(int j=0;j<n-2;j++) printf(" "); printf("%c\n",a); } for(int i=0;i<n;i++){ printf("%c",a); if(i==n-1) printf("\n"); } return 0; }
PAT B1027:打印沙漏
- 数学题,先求有几层(从3 5 7 由等差数列得递推式:2i+1),(3+5+7……累加和(3+2i+1)i/2 ->i(i+2));给出n个,满足,2i(i+2)+1>n,找最小的i(层数),则层数为i-1;
规则打印:先打上半部(先打空格,观察得空格个数是0 1 2等,假如3层,i=3,0个;i=2,1个;i=1,2个;所以用总的层数-当前层数(3-3,3-2,3-1)来输出空格),(打印字符,每层字符个数2i+1)
#include <cstdio> int main() { int N, row = 0; //row行数 char C; scanf("%d %c", &N, &C); for (int i = 0; i < N; i++) { //i表示最中间上面的层数,不包括最中间 if (2 * i*(i + 2) + 1 > N) { row = i - 1; break; } } for (int i = row; i >= 1; i--) { //从最上面一行开始,输出完row-1 for (int k = 0; k < row - i; k++) printf(" ");//输出字符前输出空格 for (int j = 0; j < 2 * i + 1; j++) printf("%c", C); //第i行符号数有(等差数列):2*i+1 printf("\n");//每行输出完换行 } for (int i = 0; i < row; i++) printf(" ");//中间行输出的空格 printf("%c", C); printf("\n"); for (int i = 1; i <= row; i++) { //输出下半部分 for (int k = 0; k < row - i; k++) printf(" "); for (int j = 2 * i + 1; j >= 1; j--) printf("%c", C); printf("\n"); } printf("%d", N - (2 * row * (row + 2) + 1)); return 0; }
PAT A1031:Hello World for U
- 题目大意:给出一串字符要求打印成U形状,且要求U的两边长度相同且最大,底边保证不少于两边的长度(n1=n3=max,n1+n2+n3−2=N);
思路:找到边长及底端长,根据题目,n=(len+2)/3;d=n+(len+2)%3;(首先让三边相等,多余出来的加入底边)。然后根据要求输出(先输出左边,空格(最后一行输出底边),右边);
#include <cstdio> #include <cstring> int main(){ int n,d; char arr[85]; scanf("%s",arr); int len=strlen(arr); n=(len+2)/3; d=n+(len+2)%3; for(int i=0;i<n;i++){ printf("%c",arr[i]); if(i<n-1){ for(int j=0;j<d-2;j++) printf(" "); }else{ for(int j=0;j<d-2;j++) printf("%c",arr[i+j+1]); } printf("%c\n",arr[len-1-i]); } return 0; }