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 }