L1-002 打印沙漏

题目链接 https://pintia.cn/problem-sets/994805046380707840/problems/994805145370476544

一上来感觉没大有头绪,一直在找规律,好像很麻烦的样子,后来发现要用到高斯求和公式。即S=n(a1+an)/2

但是做出来之后会发现其实还好。


 

放AC代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int n,t;//t为上半部分层数
 6     char a;
 7     cin>>n>>a;
 8     for(int i=1; ; i++)
 9     {//记算半层层数
10         if(2*i*i-1>n)
11         {
12             t=i-1;//因为i又+1才结束循环,所以要减掉
13             break;
14         }
15     }
16     int res=n-(2*t*t-1);//res为剩余符号个数
17     int k=0;
18     for(int i=t; i>=1; i--)
19     {//输出上半部分
20         for(int j=0; j<k; j++)
21             cout<<" ";
22         k++;
23         for(int j=0; j<2*i-1; j++)
24             cout<<a;
25         cout<<endl;
26     }
27     //因为上次循环后k+1了,而且打印下半部分时候的第一行其实是上半部分的倒数第二行
28     k-=2;//所以k要-2
29     for(int i=2; i<=t; i++)
30     {//输出下半部分
31         for(int j=0; j<k; j++)
32             cout<<" ";
33         k--;
34         for(int j=0; j<2*i-1; j++)
35             cout<<a;
36         cout<<endl;
37     }
38     cout<<res;
39     return 0;
40 }

 

posted @ 2022-04-18 15:27  爱吃虾滑  阅读(53)  评论(0编辑  收藏  举报