题目概述:
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*** * *** *****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*** * *** ***** 2
思路:
这题目有点像找规律
我的做法是把1000内每层相加的符号和计算出来
然后再根据输入得出层数
根据层数进行空格和符号的输出
这道题一开始以为要两边空格对称,但其实只要开头即可。
#include<stdio.h>
#include<string.h>
int N;
char c;
int layout;
int sum[1005];
int blank;
void all() {
sum[1] = 1;
int interval = 6;
for (int i = 2;i <= 1000;i++) {
sum[i] = sum[i - 1];
sum[i] += interval;
interval += 4;
}
}
//只是开头空格
int main() {
all();
scanf("%d %c", &N, &c);
//calculate the layout
for (int i = 1; i <= 1000; i++)
{
if (N == 1) {
layout = 1;
break;
}
if (N <= sum[i])
{
layout = i - 1;
break;
}
}
int temp = layout;
int symbol;
blank = 0;
for (int i = temp; i > 0; i--)
{
symbol = 2 * i - 1;
temp = blank;
for (int j = symbol; j > 0; j--)
{
for (blank;blank > 0;blank--)
printf(" ");
printf("%c", c);
}
printf("\n");
blank = temp;
blank += 1;
}
blank -= 1;
for (int i = 2; i <= layout; i++)
{
blank -= 1;
temp = blank;
symbol = 2 * i - 1;
for (int j = symbol; j > 0; j--) {
for (blank;blank > 0;blank--)
printf(" ");
printf("%c", c);
}
printf("\n");
blank = temp;
}
printf("%d", N - sum[layout]);
return 0;
}