**
打印沙漏
**
(哈哈哈哈今天是假期的第一天学习 刚刚问了司机 没想到他天天打代码 !偶像啊!)
本题要求你写个程序把给定的符号打印成沙漏的形状。
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
这是PTA上的截图
(别的小朋友一看到题目都想到了等差数列 就我一个傻傻的)
我思考的问题:如何居中输出? 如何输出空格?
下面是主函数体
#include<iostream>
using namespace std;
int fun(int n);
void output(int n,char x,int i);
int main()
{
int n;
char x;
cin>>n>>x;
int i=fun(n);//实现计算功能 返回i 即沙漏首行符号数
~~// 调试 cout<<i;~~
output(n,x,i);//实现输出功能 计算余数
return 0;
}
(本来我想直接一个函数的 但是后来想想封装性独立性 就写多一个)
下面函数是求出第一行应打印的符号数
int fun(int n)
{
int a=(n-1)/2;
int i=1;
if(a<3&&a>0) ;
else if(a<8&&a>2) i=3;
else
{
while(a>i)
{
i+=2;
a-=i;
}
}
~~//调试 cout<<i<<endl;~~
return i;
}
我一开始while的条件是(a>3) 显然是不对的
(哈哈哈哈哈哈但很神奇过了三个测试点 后来改了还是不对 a的情况没考虑完全 然后我就补锅哈哈哈)
下面是输出函数 我是分开了两半来输出的 一个上三角递减 一个下三角递增 然后余数我是拿了个sum来算用了多少个符号再减出来
void output(int n,char x,int i)
{
int m=i;
int sum=0;//沙漏中符号个数 算余数
while(m>0)//输出递减 有1
{
if(m<i)//判断是否首末行 否则输出空格使得沙漏居中
{
for(int p=(i-m)/2;p>0;p--)//注意是居中 不是靠右 p要除以2的
{
cout<<" ";
}
}
for(int p=m;p>0;p--)//输出符号
{
cout<<x;
}
cout<<endl;
sum+=m;
m-=2;
}
m=3;
while(m<=i)//输出递增
{
if(m<i)//判断是否首末行 否则输出空格使得沙漏居中
{
for(int p=(i-m)/2;p>0;p--)//注意是居中
{
cout<<" ";
}
}
for(int p=m;p>0;p--)//输出符号
{
cout<<x;
}
cout<<endl;
sum+=m;
m+=2;
}
cout<<n-sum;
}
一定要注意循环的条件判断啊!
然后我就对比了一下给的参考代码 首先很大不同就是运行时间 我的代码费时多了
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int x, i, j, n, blank, count;
char ch;
cin >> n >> ch;
for(count=1, x=1; count+(x+2)*2<=n; count+=(x+2)*2, x+=2);
//计算可以输出的符号总数(count),以及第一行的符号个数(x)
在计算count的时候 先用 (x+2)代替 最后再x+2
他这样是先把count需要用到的符号数先算出来了 x从3一直+2下去
他的循环的判断条件很好 (哈哈哈哈我的什么鬼)
然后是他的输出
//上半区,含中心点
for(i=x, blank=0; i>=1; blank++, i-=2)
{//i:当前行的符号个数,blank:当前行的行首空格个数
for(j=0; j<blank; j++)
cout << " "; //输出当前行的行首空格
for(j=0; j<i; j++)
cout << ch;
cout << endl;//行末空格无需输出
}
//下半区,由3个符号开始输出
for(i=3, blank-=2; i<=x; blank--, i+=2)
{
for(j=0; j<blank; j++)
cout << " ";
for(j=0; j<i; j++)
cout << ch;
cout << endl;
}
cout << n-count << endl; //输出剩余空格
return 0;
}
输出感觉跟我的差不多 但他写得好简洁啊
(还有就是原来那个1叫做中心点啊哈哈哈)
(好了 美好的一天就这么过去了 我要去看电视了)
(不喜欢打代码的小朋友今天有更喜欢打代码了吗)