沙漏(打印沙漏)

所谓沙漏,即我们通过一个特殊符号打印出一个沙漏形状的东西。而这个沙漏,它每行符号的个数都为奇数,每行中心符号对齐,相邻两排符号个数相差2,符号数先每行减少2个,减到只剩1个时,再每行增加2个,对应首尾符号数相等。

例题:

输入:输入一个数字n,和一个特殊符号,n表示提供的特殊符号个数

输出:输出特殊符号数能打印的最大沙漏,最输出剩余的特殊符号数

例如:

沙漏(打印沙漏)_第1张图片

 题解:首先,我们要明确给出的n个符号数中组成沙漏的最多数目及行数,因为我们知道沙漏是一个前后对称的图形,且相邻两行的数目差为2,此时,我们就可以写一个循环,每次每行都加2,再算出每次循环组成沙漏的需要的符号数,循环后就能知道组成沙漏的行数,再根据规律每行输出相应的空格和特殊符号。来看看代码吧,注意中间的注释哦!

代码:

#include 
#include 
using namespace std;
typedef long long ll;
int main()
{
	ll n;
	char c;//注意是用字符定义 
	scanf("%lld %c",&n,&c);//%c
	
	//下面计算n个符号数能组成沙漏需要的最多符号数和行数 
	//这里i代表每次循环需要的符号数,j代表每行的字符数,num是行数 
	ll i=1,j=1,num=1;//从最中间一行开始,所以初始值均为 1 
	while(i<=n){
		j=j+2;//每行间相差2,所以每次都加2 
		i=i+2*j;//因为沙漏前后对称,所以将j的值乘 2 
		num=num+2;//因为沙漏前后对称,s所以每次都加 2 
	}
	i=i-2*j;//这里多加了一个2j,因为循环i还是在小于n时又多进了一个循环 
	num=num-2;//道理与上面i相似 
	ll rest=n-i;//rest为剩余量
	
	//打印上部分沙漏 
	for(ll j=0;j

差不多就是这样了,这个知识点也比较容易,题型也差不多是相似的,也可能是直接给你有多少行,让你打印,这种更简单一点,就不需要你计算了,但是做题的时候,题型也可能是多变的,可能会结合其他知识点一起考,所以每个知识点都要掌握扎实,可以去找找相关的题做做,练练手。

最后,如有问题,欢迎指正哈~

你可能感兴趣的:(笔记,c++,c语言,开发语言)