自测-1 打印沙漏(20 分)
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
本题要求打印出的沙漏能用掉尽可能多的符号,我运用了函数来进行判断,函数通过for循环首先来计算从小到大每个沙漏需要的符号,同时和输入符号的数量进行比较,从而的出最优解。
#include <iostream>
using namespace std;
void sl(int num, int* x, int* y);
int main(void)
{
int num;
char type;
int t, y; //循环变量
int n, m; //n沙漏的层数 m沙漏最上的符号的数量
cin >> num >> type;
sl(num, &n, &m);
int z = 0; //每行符号前面空格的数量
int s = 0; //记录形成沙漏所使用富豪的数量
int k = ((n - 1) / 2) + 1; //沙漏最中间的层数
while (n)
{
for (t = 0; t < z; t++)
{
cout << " ";
}
for (y = 0; y < m; y++)
{
cout << type;
s++;
}
cout << endl;
if (n <= k)
{
z--;
m += 2;
}
else
{
z++;
m -= 2;
}
n--;
}
cout << num - s;
return 0;
}
void sl(int num, int* x, int* y) //函数实现沙漏能用掉尽可能多的符号 用指针返回沙漏的层数和最上层符号数目
{
int i, j = 1, k = 1;
for (i = 1; i < 100; i++)
{
if (i > 1)
{
k += 2;
j += k * 2;
}
if (j > num)
{
*x = i * 2 - 3;
*y = k - 2;
break;
}
}
}
若发现错误或建议 望不吝赐教