本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
!!!!怎么搞出来有几行,一行有几列?
1 3 5 7 9这样一个数列,每一个沙漏从小到大对应的符号个数:1 1+3*2 1+3*2+5*2 1+3*2+5*2+7*2 1+3*2+5*2+7*2+9*2,
样例中的19=2+(1+2*3+2*5);
正好是每一行对应的列数
上面是倒三角去掉小尖尖
下面是正三角
int num,sum=1;
int m=3;//一开始m多加了一个2
while(sum<=n)
{
num=sum;
sum+=m*2;
m+=2;//sum的判断在m+=2后面,m多加了一个2
}
m-=4;
用num记载最终的sum,就是说n-num就是最后一行的数字
最终的m记载的是最长的那一行的列数
然后我们可以推出m/2是上面倒三角的行数
而每一行的空格数对应着行号
for(int i=0;i<m/2;i++)
{
for(int j=0;j<i;j++)
cout<<" ";
for(int j=0;j<m-i*2;j++)
cout<<s;
cout<<endl;
}
m/2+1是下面正三角的行数
每一行的空格数对应着行标-1
for(int i=m/2+1;i>0;i--)
{
for(int j=0;j<i-1;j++)
cout<<" ";
for(int j=0;j<m-(i-1)*2;j++)
cout<<s;
cout<<endl;
}
ac代码:
// gcd lcm有理数
// main.cpp
// 猫猫头
//
// Created by Mintink on 2020/1/12.
// Copyright © 2020 Mintink. All rights reserved.
//
#include<iostream>
#include<string.h>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<set>
#include<numeric>
#include<vector>
#include<queue>
#include<array>
#define _USE_MATH_DEFINES
using namespace std;
typedef long long ll;
const int mod=10^9+7;
#define inf 0x3f3f3f3f
//tuple<int,int,int>p[100000]
int main()
{
int n;
char s;
cin>>n>>s;
int num,sum=1;
int m=3;//一开始m多加了一个2
while(sum<=n)
{
num=sum;
sum+=m*2;
m+=2;//sum的判断在m+=2后面,m多加了一个2
}
m-=4;
//cout<<n-num<<endl;
//cout<<m<<endl;
for(int i=0;i<m/2;i++)
{
for(int j=0;j<i;j++)
cout<<" ";
for(int j=0;j<m-i*2;j++)
cout<<s;
cout<<endl;
}
for(int i=m/2+1;i>0;i--)
{
for(int j=0;j<i-1;j++)
cout<<" ";
for(int j=0;j<m-(i-1)*2;j++)
cout<<s;
cout<<endl;
}
cout<<n-num;
return 0;
}