7-1 打印沙漏 (20分)
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
************
*****
2
题目分析
首先经过题目分析,可知特殊符号数跟行数有着某种特殊关系,除去中间的一颗星星*,可以发现上半部分的是个递增的等差数列:3,5,7,9,…,可得通项公式2n+1(其中n = 上半部分行数 = 下半部分行数)
那么求和即为Sn = n2+2n,这是上半部分的。那么上下两部分即可得到:
总**用量:2( n2+2n) = 2n2+4n
到这里我们就可以算出输入的数能生成几行了。
打印沙漏
正确代码
#include<iostream>
using namespace std;int n,len=1,sum=1;
char c; int main(){cin>>n>>c; //19 *for(;sum<=n;len++){ sum+=2*(2*len+1); }len--; //!!!因for循环的len++所以多加了1个len len--; //因为sum<=n 所以sum多了一次,所以len也多了一次
// len/=2;sum=1+2*(len*(len+2)); //重新计算sum int l=len; //2for(int i=1;i<=len;i++){for(int j=1;j<i;j++){cout<<' ';}for(int j=1;j<=2*l+1;j++){cout<<c;}l--; //知识点:l--在for的外面 cout<<endl;}//中间for(int i=1;i<=len;i++){cout<<' ';} cout<<c;cout<<endl;//下面l=len; //知识点:倒序的用l l--在for外面 for(int i=1;i<=len;i++){for(int j=1;j<l;j++){cout<<' ';}l--; for(int j=1;j<=2*i+1;j++){cout<<c;}cout<<endl;}cout<<n-sum;
}
#include <iostream>
using namespace std;int main() {int N; char c;cin >> N;cin >> c;//计算行数row,只计算一半的行数,不包括最中间的那个一个符号int row = 0;for (int i = 1; i < N; i++) {if ((2 * i * (i + 2) + 1) > N) {row = i - 1;break;}}// 打印上半部分for (int i = row; i >= 1; i--) {for (int k = row - i; k >= 1; k--) {cout << " ";}for (int j = i * 2 + 1; j >= 1; j--) {cout << c;}cout << endl;}// 打印中间的那个符号for (int i = 0; i < row; i++) {cout << " ";}cout << c << endl;// 打印下半部分for (int i = 1; i <= row; i++) {for (int k = row - i; k >= 1; k--) {cout << " ";}for (int j = i * 2 + 1; j >= 1; j--) {cout << c;}cout << endl;}// 输出还剩下几个符号没有用cout << (N - (2 * row * (row + 2) + 1));return 0;
}
错误代码
#include<iostream>
using namespace std;
//19-1=18/2=9=2n-1 n=5 (N-1)/2=2n-1 ((N-1)/2+1)/2 ==n==5int main(){int N;char c;cin>>N>>c;int n=((N-1)/2+1)/2; //第一行有几个int len=n/2+1; //上三角多少行for(int i=0;i<len;i++){ //行 for(int j=0;j<i;j++){cout<<' ';}for(int j=0;j<n-2*i;j++){cout<<c;}cout<<endl;} for(int i=0;i<len-1;i++){ //行少了一个 for(int j=0;j<(n-(2*(i+1)+1))/2;j++){ //空格多了一个 cout<<' ';}for(int j=0;j<2*(i+1)+1;j++){ //*少了两个 cout<<c;}cout<<endl;} int sum=1;for(int k=3;k<=n;k=k+2){sum+=k*2;}cout<<N-sum;
}
7-1 打印沙漏 (20分)相关推荐
- C语言程序练习-L1-002 打印沙漏 (20分)
L1-002 打印沙漏 (20分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 所谓"沙漏形状",是指每行输出奇数 ...
- C++学习之路 | PTA乙级—— 1027 打印沙漏 (20 分)(精简)
1027 打印沙漏 (20 分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 所谓"沙漏形状",是指每行输出奇数个 ...
- 7-138 打印沙漏 (20 分)
7-138 打印沙漏 (20 分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ************ ***** 所谓" ...
- 7-1 打印沙漏 (20 分)
** 7-1 打印沙漏 (20 分) ** 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ************ ***** 所谓&q ...
- PTA练习题1027 打印沙漏 (20分)
1027 打印沙漏 (20分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 所谓"沙漏形状",是指每行输出奇数个符 ...
- 打印沙漏 (20 分)
打印沙漏 (20 分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 所谓"沙漏形状",是指每行输出奇数个符号:各行 ...
- 1027 打印沙漏 (20 分)
1027 打印沙漏 (20 分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 所谓"沙漏形状",是指每行输出奇数个 ...
- PTA乙级 1027 打印沙漏——20分
本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ************ ***** 所谓"沙漏形状",是指每行输出奇 ...
- 1027 打印沙漏 (20分)——27行代码AC(结构清晰)
立志用更少的代码做更高效的表达 PAT乙级最优题解-->传送门 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ********** ...
最新文章
- 微信小程序上传的视频显示封面 我是阿里云oss的实现
- webgl 游戏_如何选择 WebGL 框架和引擎?
- vue 项目中使用粘性布局不起作用_做vue项目中遇到的坑总结与学习
- 解决apache的the requested operation has failed
- Hibernate 入门 特性配置
- IDEA新特性真牛逼:提前知道代码怎么走!
- 保存Google、Bing翻译的语音
- 简单提高MIDI音量的方法
- 趣闲赚~~~~~~青龙脚本
- Element table各种合并单元格
- numpy第三章-索引器、多级索引
- Jmeter beanshell语法
- Java集合的接口和类层次结构图以及代码示例
- 如何实现U盘低格?这样操作快速搞定!
- 网页中的th/th是什么意思
- 计算机毕业设计源代码Python毕业论文题目基于Python实现的学生在线选课系统[包运行成功]
- python xlsxwriter行数_使用python库xlsxwriter库来输出各种xlsx文件的示例
- 天威诚信荣获「金融科技领域最具品牌影响力奖」
- 如何破解安腾校园网客户端(2)
- RandLA-Net 论文学习
热门文章
- [翻译] 使用 TensorFlow 进行分布式训练
- springboot毕设项目“果然是你”水果直销平台vkfo8(java+VUE+Mybatis+Maven+Mysql)
- 17joys用户管理 添加用户
- 浪潮超融合服务器虚拟机管理,浪潮联合VMware发布新一代超融合一体机
- 超融合一体机与一体机的区别
- Spring之Bean的自动装配
- 【Redis详细安装教程】
- Python编程从入门到实践 第十章:文件和异常 练习答案记录
- 283移动零之Leecode—数组篇(双指针)
- vue高德地图实现关键字搜索