PTA-乙级 1027 打印沙漏(测试点1、3、4)
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
注意点:
(1)输出符号前有空格,符号后没空格;(测试点1)
(2)比较n与sn时,用乘不用除;(测试点3 4,剩余符号数是否正确)
知识点:
c++:重复输出相同符号
#include<string>
string pr1(10,'*');//将输出10个*
代码:
#include<iostream>
#include<string>
using namespace std;
int main(){
char ch;
int n,sn=0,i=0;
cin>>n>>ch;
while(sn<=n){
i++;
sn=2*i*i+4*i+1;
}
i=i-1;
sn=2*i*i+4*i+1;
int length=3+(i-1)*2;
int an;
for(int j=i; j>0; j--){
an=3+(j-1)*2;
int in=(length-an)/2;
string pr1(in,' ');
string pr2(an,ch);
cout<<pr1<<pr2<<'\n';
}
int k=(length-1)/2;
string pr(k,' ');
cout<<pr<<ch<<'\n';
for(int j=1; j<=i; j++){
an=3+(j-1)*2;
int in=(length-an)/2;
string pr1(in,' ');
string pr2(an,ch);
cout<<pr1<<pr2<<'\n';
}
cout<<n-sn<<endl;
}