PAT (Basic Level) Practice (中文) 1027 打印沙漏 (20分)——测试点0,1,2出错

记做题时犯的错
题目地址:https://pintia.cn/problem-sets/994805260223102976/problems/994805294251491328

题目描述

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

*****
 ***
  *
 ***
*****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

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

输入格式

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

输出格式

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

输入样例

19 *

输出样例

*****
 ***
  *
 ***
*****
2

解题思路

自己的做法:
1.使用sum记录三角形底边拥有字符数为i时,包含的所有字符的数量。

int sum = 1,max = 1;
	for(;sum <= n;)
	{
		max += 2;
	    sum = sum + max * 2;
	}
	sum = sum - max * 2;
	max = max - 2;

2.使用for循环语句按规则打印字符
算法笔记做法:
1.使用sqrt()函数,根据下面的公式求得三角形底边拥有的字符数
在这里插入图片描述

int bottom;
bottom = (int)sqrt(2.0 * (n + 1)) - 1;
if(bottom % 2 == 0)
   bottom --;

2.使用for循环语句按规则打印字符

出错点

在第一次提交时使用的代码中,打印沙漏的语句比下面的正确代码的语句更加复杂,有点乱。提交后发现只通过了第三个测试点,其余测试点都显示答案错误。
发现出错后,由于代码太乱了,所以一时之间也不知道哪里出错了,然后重新写了另一种打印沙漏的的代码,成功通过。
错误代码留在下面。

//错误方法
int i,j,count;
	i = max;
	for(count = 0;count < max / 2;count ++)
	{
		for(j = count;j > 0;j --)
		    printf(" ");
		for(j = i;j > 0;j --)
		    printf("%c",ch);
		printf("\n");
		i = i - 2;
	}
	for(j = count;j > 0;j --)
	    printf(" ");
	printf("*\n");
	count -= 1;
	for(;count >= 0;count --)
	{
		for(j = count;j > 0;j --)
		    printf(" ");
		i = i + 2;
		for(j = i;j > 0;j --)
		    printf("%c",ch);
		printf("\n");
	}

正确代码

#include 

using namespace std; 

int main() {
	int n;
	char ch;
	scanf("%d %c",&n,&ch);
	int sum = 1,max = 1;
	for(;sum <= n;)
	{
		max += 2;
	    sum = sum + max * 2;
	}
	sum = sum - max * 2;
	max = max - 2;
	//输出倒三角 
	for(int i = max;i >= 1;i -= 2)
	{
		for(int j = 0;j < (max - i) / 2;j ++)
		    printf(" ");
		for(int j = 0;j < i;j ++)
		    printf("%c",ch);
		printf("\n");
	}
	//输出正三角
	for(int i = 3;i <= max;i += 2)
	{
		for(int j = 0;j < (max - i) / 2;j ++)
		    printf(" ");
		for(int j = 0;j < i;j ++)
		    printf("%c",ch);
		printf("\n");
	} 
	printf("%d",n - sum);
	return 0;
}

你可能感兴趣的:(PAT)