所谓沙漏,即我们通过一个特殊符号打印出一个沙漏形状的东西。而这个沙漏,它每行符号的个数都为奇数,每行中心符号对齐,相邻两排符号个数相差2,符号数先每行减少2个,减到只剩1个时,再每行增加2个,对应首尾符号数相等。
例题:
输入:输入一个数字n,和一个特殊符号,n表示提供的特殊符号个数
输出:输出特殊符号数能打印的最大沙漏,最输出剩余的特殊符号数
例如:
题解:首先,我们要明确给出的n个符号数中组成沙漏的最多数目及行数,因为我们知道沙漏是一个前后对称的图形,且相邻两行的数目差为2,此时,我们就可以写一个循环,每次每行都加2,再算出每次循环组成沙漏的需要的符号数,循环后就能知道组成沙漏的行数,再根据规律每行输出相应的空格和特殊符号。来看看代码吧,注意中间的注释哦!
代码:
#include <iostream>
#include <algorithm>
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<num/2+1;j++){
for(ll i=0;i<j;i++){
printf(" ");
}
for(ll i=0;i<num-2*j;i++){
printf("%c",c);
}
printf("\n");//记得要换行
}
//打印下部分沙漏
for(ll j=1;j<=num/2;j++){
for(ll i=0;i<num/2-j;i++){
printf(" ");
}
for(ll i=0;i<2*j+1;i++){
printf("%c",c);
}
printf("\n");
}
printf("%lld",rest);
return 0;
}
差不多就是这样了,这个知识点也比较容易,题型也差不多是相似的,也可能是直接给你有多少行,让你打印,这种更简单一点,就不需要你计算了,但是做题的时候,题型也可能是多变的,可能会结合其他知识点一起考,所以每个知识点都要掌握扎实,可以去找找相关的题做做,练练手。
最后,如有问题,欢迎指正哈~