PTA 打印沙漏

1 篇文章 0 订阅

https://pintia.cn/problem-sets/17/problems/260

题解

关键词:等差数列,循环
思路:打印三个部分:每行左侧的空格,每行的符号,以及最后的剩余数字。
坑点:沙漏右侧不能输出空格,否则会有格式错误。最后一行输出数字后换行。
输出样例分析
参考代码:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <stack>
#include<stdio.h>
using namespace std;
void printStar(char c);
void printSpace();
void pringLine(int leftSpace, int width, char c);
bool judgeDeepth(int n, int x);
int main() {
	int x;
	char c;
	scanf("%d %c", &x, &c);
	// 1 3 5 奇数  2n-1   半边星星总数n^2
    //n 层
	//总星星数目  2*n^2 -1
	int n = 1;//半边三角的高度
	while (!judgeDeepth(n,x)) {
		n++;
	}
	int rest = x - (2 * n * n - 1);
	//display
	int width = 2 * n - 1;
	for (int i = 0; i < n; i++)
	{
		pringLine(i, width, c);
	}
	for (int i = n - 2; i >= 0; i--)
	{
		pringLine(i, width, c);
	}
	printf("%d\n", rest);
	return 0;
}
bool judgeDeepth(int n, int x) {
	int currentNum = 2 * n * n - 1;
	int nextNum = 2 * (n + 1) * (n + 1) - 1;
	return  (currentNum <= x) && (nextNum > x);
}
void pringLine(int leftSpace, int width, char c) {
	//int leftSpace = i;
	int righSpace = leftSpace;
	for (int j = 0; j < leftSpace; j++)
	{
		printSpace();
	}
	for (int j = 0; j < width - leftSpace - righSpace; j++)
	{
		printStar(c);
	}
	//注意:右侧不要打印符号!否则会“格式错误”
	//for (int j = 0; j < righSpace; j++)
	//{
	//	printSpace();
	//}
	printf("\n");
}
void printStar(char c) {
	printf("%c", c);
}
void printSpace() {
	printf(" ");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值