PAT Basic 1027. 打印沙漏
PAT Basic 1027. 打印沙漏
1. 题目描述:
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
2. 输入格式:
输入在一行给出1个正整数N(\(≤1000\))和一个符号,中间以空格分隔。
3. 输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
4. 输入样例:
19 *
5. 输出样例:
*****
***
*
***
*****
2
6. 性能要求:
Code Size Limit
16 KB
Time Limit
400 ms
Memory Limit
64 MB
思路:
这里根据题目描述得出最大行数即可,当时是推公式直接把行数解出来了。。。结果因为sqrt()算出来的行数是个浮点数,涉及到类型转换,导致我testpoint2没过,又额外加了个判断条件。
其实直接一个while循环统计出最大行数就好了,这样写就是简单问题复杂化,不过可以直接解析的算出来行数。
My Code:
#include <stdio.h>
#include <math.h>
int main(void)
{
int chNum = 0;
char character;
int count = 0, root1 = 0, n = 0;
scanf("%d %c", &chNum, &character);
// 1 + (3 + 5 + ... + n) * 2 == chNum
// 3 + 5 + ... + n == (chNum - 1)/2
// 3 + 5 + 7
// 7 + 5 + 3
// left == (n+3) * ((n-3)/2+1) / 2
// == (n+3) * (n-1)/2 / 2
// == (chNum - 1)/2
// (n+3)(n-1) / 2 == chNum-1
// n^2 + 2n -3 == (chNum-1) * 2
// n^2 + 2n -3 -(chNum-1)*2 == 0
// get n1, n2, choose bigger one. !!! root1 must bigger
n = -3 - (chNum-1)*2;
root1 = (-2 + sqrt(4-4*n)) / 2;
//root2 = (-2 - sqrt(4-4*n)) / 2;
if(root1 % 2 == 0) // beacuse double value of sqrt() to int, the floor round will make root1 even, testpoint2 reject.
root1--;
count = root1;
while(count >= 1)
{
for(int i = root1-count; i>0; i-=2)
{
printf(" ");
}
for(int i = count; i>0; i--)
{
printf("%c", character);
}
// for(int i = root1-count; i>0; i-=2)
// {
// printf(" ");
// }
printf("\n");
count -= 2;
}
count = 3;
while(count <= root1)
{
for(int i = root1-count; i>0; i-=2)
{
printf(" ");
}
for(int i = count; i>0; i--)
{
printf("%c", character);
}
// for(int i = root1-count; i>0; i-=2)
// {
// printf(" ");
// }
printf("\n");
count += 2;
}
printf("%d\n", chNum - ((root1+3)*(root1-1)/2) -1);
return 0;
}