7-7 打印沙漏 (20 分)


虽然这道题在比赛的时候,惊险的AC了,但是我之前做过的,比赛遇到了还是有点慌,就记录一下。希望以后心态好一点。

 

 可以先假设中间会输出两个一点,然后推导公式 sum = i * i, 但是最后要减去1,而 i--, 这样i就是对应的层数了(对了,要记得乘2,因为sum算的是一个完整的,而我们假设的是两个对称的)

AC代码:

#include 
using namespace std;
int main()
{
    int n, i, sum;
    char c;
    cin >> n >> c;
    for(i = 1; ; i++)
    {
        if(2*i*i-1 > n)
        {
            sum = 2*(i-1)*(i-1) - 1;
            break;
        }
    }
    
    int sx = n - sum;
    i--;
    for(int j = i; j >= 1; j--)
    {
        for(int k = i - j; k > 0; k--)
            cout << ' ';
        for(int k = 2*j-1; k > 0; k--)
            cout << c;
        cout << endl;
    }
    for(int j = 2; j <= i; j++)
    {
        for(int k = i - j; k > 0; k--)
            cout << ' ';
        for(int k = 2*j-1; k > 0; k--)
            cout << c;
        cout << endl;
    }
    cout << sx << endl;
    return 0;
}

相关