L1-002 打印沙漏 (20分)

这道题的关键就在确定行数,17 = (3 + 5)* 2 + 1,最大奇数即为行数,如果sum * 2 + 1 == n,最大奇数即为行数,如果 > n ,让最大奇数-2,返回上一个奇数, 剩余的字符用n - (sum * 2 + 1),然后就输出部分,下面的代码中有详细的注释,这道题我真没想出来,看了大佬的代码。

L1-002 打印沙漏 (20分)_第1张图片

#include
using namespace std;
int n, sum, sur;//sur是剩余的个数 
char x;// " * "  
int main()
{
	cin.tie(0); 
    int line = 1;//行数 
    cin >> n >> x;
    for(int i = 3; ; i += 2)
    {
        sum += i;//奇数和
        if(sum * 2 + 1 >= n)//当前类加载sum上的奇数==行数 
        {
            if(sum * 2 + 1 > n)//当前累加在sum上的奇数大于行数 
            {
                sum -= i;// 减去当前累加的奇数 
                i = i - 2;//退回上一层i 
            }
            line = i;//此时的行数就等于最大奇数 

            sur = n - (sum * 2 + 1);//剩余字符数 = 总数 - 填满的数 
            break;
        }
    }
    //输出操作 
    int ch = line, space = 0;//字符数和空格数 
    for(int i = 1; i <= line; i ++ )//5行 
    {
        for(int j = 1; j <= space; j ++ )
        cout << " ";
        for(int j = 1; j <= ch; j ++ )
        cout << x;//每行输出字符* 
        if(i <= (line - 1) / 2 + 1)//上半部分 
        {
            space ++ ;//加一是因为字符后面没空格,前面有空格 
            ch = ch - 2;//每输出完一行,空格数+1,字符数-2 
        }
        else//下半部分 
        {
            space -- ;
            ch = ch + 2;//空格数-1,字符数+2 
        }
        if(ch == -1)//当行数处于最中间时,空格数变为3,字符数变为-1 
        {
            space = space - 2;//下一行需要一个空格,所以-2 
            ch = ch + 4;//下一行字符数 + 4才能变为3字符 
        }
        cout << endl;
    }
    cout << sur;//输出剩余字符数 
    return 0;
}

你可能感兴趣的:(#,PTA团体程序设计天梯赛)