L1-002 打印沙漏 (20 分)
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
解题思路
周末天梯赛了,打算把之前的题做一做。。
然后。。。
一看不难,找到规律之后就很简单了,循环加输出之后提交,但是两分没过。。
改===》最开始的时候没加最后输出结果的判断(非0输出)
依旧两分绿。。。
改===》特判 0,1,2
依旧两分绿。。。
内心无语中。。。
找了找之前的代码,想看看之前自己怎么做的,忽然发现从第一次到现在都是18分过的,,,,
百度各种代码,嗯,怎么对1的特判不太一样。。
再改===》过了。。
我也是很无语,最后的两分点竟然是在
if(N==1)
{
cout<<ch<<endl<<"0";
return 0;
}
如果N是1的时候,虽然余数是0,但是还要输出。
除了1之外的别的余数为0的时候,输出不输出都是对的。
总结就是,余数必须输出,哪怕为0!!!
做题还是有点想当然,,,没有把题目,理解到位,加入了太多自己的想法。
有自己的想法是好,要用对地方。嗯,,程序人生啊。
完整代码:
#include<bits/stdc++.h>
using namespace std;
int N;
char ch;
void daying(int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<i;j++)
cout<<" ";
for(int j=0;j<(n-i)*2-1;j++)
cout<<ch;
cout<<endl;
}
for(int i=0;i<n-1;i++)
{
for(int j=0;j<(n-i-2);j++)
cout<<" ";
for(int j=0;j<(i+1)*2+1;j++)
cout<<ch;
cout<<endl;
}
}
int main()
{
cin>>N>>ch;
if(N==0)
return 0;
if(N==1)
{
cout<<ch<<endl<<"0";
return 0;
}
int x;
for(int i=1;i<N;i++)
{
if( pow(i,2)*2-1 >N)
{
x=i-1;
break;
}
}
//打印
daying(x);
//计算
int ans = N - (pow(x,2)*2-1);
cout<<ans;
}