PTA自测-1 打印沙漏
题目
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式: 输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式: 首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例: 19 * 输出样例:
*****
***
*
***
*****
2
因为前几次提交的时候有格式错误,看了别人的提醒才知道要注意:
每一行输出完符号后,它后面是没有空格的!!!空格只能前面有空格,后面不能有!!!
还有就算没有剩余的符号也要输出0。
代码思路
这里是先创建一个奇数数组,为什么创建奇数数组?因为在数组下标为0,元素为1,则20+1=1,下标为1,元素为3,则21+1=3......以此类以,用下标作为一边需要输的行数。如下图所示:
然后输入的符号个数减去1,减去的1是沙漏中间只有一个符号的那一行,剩下的除2平分掉,相对于把沙漏上下平分掉,因为除去了中间那一个,上下部分是一样数目的。并且一定要算出有没有余数,余数是要算在剩余字符数量里的。如19个字符,出去中间部分,19-1=18,然后平分,18/2=9,余数为0,两边各自的符号数量为9。如果数目为20,20-1=19,19/2=9,余数为1,余数要加在剩余符号数量里。
然后算出一边的数目后,这个数目和奇数数组从0开始一直比较,当奇数数组的元素小于或等于这个数目,则该数目就等于该数目减去元素,再接着与下一个元素比较,以此类推,最后元素大于该数目,则剩下的该数目就为剩余的数的一部分。
代码
#include <stdio.h>
void print_top(int num[],int i,char zf);
void print_bottom(int num[],int i,char zf);
int main(void)
{
int n;
int num[1000];
int shu,shu1;
char zf;
int i;
//设置奇数表,根据下标来取对应的元素来决定上半部分or下半部分要输出多少行
for(n=0;n<1000;n++){
num[n]=2*n+1;
}
//输入两个数
scanf("%d %c",&shu,&zf);
//算出除了中间一个,两边各自的数量
shu1 = (shu-1)/2;
//循环每个奇数与shu1比较
for(i=1;num[i]<=shu1;i++){
shu1 = shu1-num[i]; //shu1位一边剩余的数
}
if(shu!=0 && (shu-1)%2==0){
print_top(num,i-1,zf);
print_bottom(num,i-1,zf);
printf("%d",shu1*2);
}else if(shu!=0 && (shu-1)%2!=0){
print_top(num,i-1,zf);
print_bottom(num,i-1,zf);
printf("%d",shu1*2+((shu-1)%2));
}
return 0;
}
void print_top(int num[],int i,char zf)//打印上部分
{
int j,k,x;
//i为从传过来的i-1打印最多字符的下标
for(j=i;j>=0;j--){ //根据下标来输出多少行
if(j!=i){ //当j不为最多符号那一行
for(x=j;x<i;x++){ //打印空格
printf(" ");
}
}
for(k=0;k<num[j];k++){ //根据该下标的元素值来决定打印多少次符号
printf("%c",zf);
}
printf("\n");
}
}
void print_bottom(int num[],int i,char zf)//打印下部分
{
int j,k,x;
for(j=1;j<=i;j++){
if(j!=i){
for(x=j;x<i;x++){
printf(" ");
}
}
for(k=0;k<num[j];k++){
printf("%c",zf);
}
printf("\n");
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)