【练习】PAT 乙 1027 打印沙漏

题目

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:
19 *

输出样例:
*****
***
*
***
*****
2

来源:PAT 乙 1027 打印沙漏



题解

#include
using namespace std;

#define N 50  // 定义常量 N,表示数组的最大长度
char c;       // 存储输入的字符
int num[N] = {0};  // 数组 num,用于标记奇数行
int sum = 1, n, t, j, tmp;  // sum: 累加值, n: 输入的数字, t: 剩余字符数, j: 最大行数, tmp: 临时变量

int main()
{
    cin >> n >> c;  // 输入数字 n 和字符 c

    // 如果 n 小于 7,直接输出结果
    if (n >= 1 && n < 7)
    {
        cout << c << endl;  // 输出字符
        cout << n - 1;      // 输出剩余字符数
        return 0;           // 结束程序
    }

    // 初始化 num 数组,标记奇数行
    for (int i = 1; i < N; i ++)
        if (i % 2 == 1)
            num[i] = 1;  // 奇数行标记为 1

    // 计算最大行数 j 和剩余字符数 t
    for (int i = 3; i < N; i ++)
    {
        if (num[i] == 1)  // 如果是奇数行
        {
            sum += i * 2;  // 累加值增加 i * 2
            if (sum <= n)  // 如果累加值小于等于 n
            {
                t = n - sum;  // 计算剩余字符数
                j = i;        // 记录当前行数
            }
            else 
                break;  // 如果累加值超过 n,退出循环
        }
    }

    // 输出上半部分(从最大行数 j 开始,每次减少 2)
    int k = j;
    while (k >= 1)
    {
        if (k < j)
            tmp = (j - k) / 2;  // 计算每行前面的空格数

        // 输出空格
        for (int i = 1; i <= tmp; i ++) cout << " ";
        // 输出字符
        for (int i = 1; i <= k; i ++) cout << c;
        cout << endl;  // 换行

        k -= 2;  // 行数减少 2
    }

    // 输出下半部分(从 3 开始,每次增加 2)
    k = 3;
    while (k <= j)
    {
        tmp = (j - k) / 2;  // 计算每行前面的空格数

        // 输出空格
        for (int i = 1; i <= tmp; i ++) cout << " ";
        // 输出字符
        for (int i = 1; i <= k; i ++) cout << c;
        cout << endl;  // 换行

        k += 2;  // 行数增加 2
    }

    // 输出剩余字符数
    cout << t << endl;
    return 0;
}

纯代码

#include

using namespace std;

#define N 50
char c;
int num[N] = {0}; 
int sum = 1, n, t, j, tmp;

int main()
{
	cin >> n >> c;
	
	if (n >= 1 && n < 7)
	{
		cout << c << endl;
		cout << n - 1;
		return 0;
	}
		
	for (int i = 1; i < N; i ++)
		if (i % 2 == 1)
			num[i] = 1;
	
	for (int i = 3; i < N; i ++)
	{
		if (num[i] == 1)
		{
			sum += i * 2;
			if (sum <= n)
			{
				t = n - sum;
				j = i;
			}
			else 
				break;
		}
	 } 
	 
	int k = j;
	while (k >= 1)
	{
		if (k < j)
	 		tmp = (j - k) / 2;
	 		
	 	for (int i = 1; i <= tmp; i ++) cout << " ";
	 	for (int i = 1; i <= k; i ++) cout << c;
	 	cout << endl;
	 		
	 	k -= 2;
	}
	
	k = 3;
	
	while (k <= j)
	{
	 	tmp = (j - k) / 2;
	 		
	 	for (int i = 1; i <= tmp; i ++) cout << " ";
	 	for (int i = 1; i <= k; i ++) cout << c;
	 	cout << endl;
	 		
	 	k += 2;
	}
 	
 	cout << t << endl;
    return 0;
}

你可能感兴趣的:(PAT,题解,输入输出,算法,c++,开发语言)