首页 > 学院 > 开发设计 > 正文

PAT-B 1027. 打印沙漏(20)

2019-11-08 02:43:55
字体:
来源:转载
供稿:网友

题目链接在此。

一个类似题目。

思路

先通过枚举累加的方法拿到沙漏最大行的符号个数max,之后将沙漏分为上面的倒三角和下面的梯形进行输出。

需要注意的是,在得到什么时候输出空格什么时候输出字符的时候,需要拿到循环变量的关系,这个关系我是通过求直线方程的方式拿到的。仍然可以用类似题目中先打印什么,后打印什么的方法(这题对于每一行,就是先打印一定数量的空格,再打印一定数量的符号 ,打印的空格数是(max-i)/2个,i是行号)。

其实在我的理解里,“打印图形”类的题目也是模拟类题,只需要找到3个信息:需要几行、需要几列、每行输出的规则

代码

#include<stdio.h>int main(){ int n; char c; scanf("%d %c",&n,&c); int max; //记录最大行符号个数 int row = 0; //记录(行数-1)的一半 int cnt = 0; //打印符号的个数 int sum = 1; for(int i = 3 ; ; i+=2){ sum += i*2; row++; if(sum >= n) { max = i; break; } } if(sum > n){ //会多出符号的情况 row--; sum -= max; max -= 2; } //打印上面倒三角 int col = max; for(int i = 0 ; i < row+1; i++){ for(int j = 0; j < col; j++){ if(j < i){ putchar(' '); }else{ putchar(c); cnt++; } } col--; PRintf("/n"); } //打印下面的梯形 col += 2; //col在打印完倒三角的最后一行后-1,所以+2而不是+1 for(int i = 0; i < row; i++){ for(int j = 0; j < col; j++){ if(j < -i+row-1 ){ //这个关系式式通过直线方程拿到的 putchar(' '); }else{ putchar(c); cnt++; } } col++; printf("/n"); } printf("%d/n",n-cnt); return 0;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表