欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PTA 打印沙漏

程序员文章站 2022-06-08 08:22:16
...

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

题解

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

#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(" ");
}