#include<iostream> using namespace std; int n,k=1,rest;//k是倒三角的层数 char ch; void fun(int space,int c){ while (space--) { cout<<" "; } while (c--) { cout<<ch; if (!c) { cout<<endl; } } } int space=0,c=0; int main() { cin>>n>>ch; //思路:先算给定的n可以盖几层,由层数推得顶层字符数,依次打印即可 //总数:n //实际上用掉的个数:num //就倒三角来看,层数k和沙漏字符总数有一定的关系 //所以不妨枚举倒三角层数并顺手算出这个情况下的沙漏所需字符数,由此推得给定的n个字符中有多少是实际用上的 // //对于倒三角而言,第k层的字符数为2*k-1(从下往上数,也就是从倒三角的顶点处开始往上数) //由数列公式,倒三角(2*k-1+1)*k>>1=k*k,沙漏2*k*k-1 while (2*k*k-1<=n)//计算倒三角的层数 { k++; } --k; rest=n-2*k*k+1; //如何打印? c=2*k-1; for (size_t i = 0; i < k; i++) { fun(space,c); space++; c-=2; } space-=2; c+=4; for (size_t i = 0; i < k-1; i++) { fun(space,c); space--; c+=2; } cout<<rest; return 0; }
题目链接:题目详情 - L1-002 打印沙漏 (pintia.cn)
标签:沙漏,int,倒三角,002,层数,L1 From: https://www.cnblogs.com/shinnyblue/p/17133866.html