L1-002 打印沙漏 (20分)------使用c和python实现!

Posted 孤寒者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了L1-002 打印沙漏 (20分)------使用c和python实现!相关的知识,希望对你有一定的参考价值。

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

*****
 ***
  *
 ***
*****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:

19 *

输出样例:

*****
 ***
  *
 ***
*****
2

解题思路:

①我们观察题目要求输出图形是漏斗形状,分为一上一下两半部分,单看上半部分规律是:1,3,5,7,9…;但看下半部分也是同样规律。
②而且,注意图形中空格的话,我们只需要考虑左边部分的空格,右边部分的可以通过每输出一行就换行实现。
③所以,思路明了,最先做的是要计算出输入个数个的*可以排多少层。

1.c代码实现:

#include <stdio.h>

int main()
{
    int n;
    char a;
    scanf("%d %c",&n,&a);
    int sum = 1;				//所需*个数
    int i = 1;					//上半部分层数
    while(sum<=n)				//此处通过每行图形的规律计算出给定个数的*可以排几层
    {
        sum+=2*(2*(i+1)-1);		//第一层是一个*,初始化时已经给出。每行的个数的规律是:2n-1,但是上下两半部分,所以整体乘2
        if(sum<=n)
            i++;
    }
    //输出上半部分
    int j,k;
    for(j=0;j<i;j++)				//j<i是上半部分层数,控制上半部分层数
    {
        for(k=0;k<j;k++)			//输出空格,上半部分空格个数和行数有关,第一行0个;第二行1个。
        {
            printf(" ");
        }
        for(k=0;k<(2*(i-j)-1);k++)	//输出*,上半部分总层数为i层,通过(i-j)控制3,5,7,9...反过来输出为9,7,5,3...
        {
            printf("%c",a);
        }
        printf("\\n");
    }
    //输出下半部分
    for(j=2;j<=i;j++)		//下半部分少了第一层,直接从第二层开始。最大层数为上半部分层数
    {
        for(k=0;k<i-j;k++)	//空格的个数依然和层数有关。总层数-目前层数即为空格个数
        {
            printf(" ");
        }
        for(k=0;k<2*j-1;k++)		//*个数直接按规律输出:1,3,5,7...
        {
            printf("%c",a);
        }
        printf("\\n");
    }
    printf("%d",(n-(sum-2*(2*(i+1)-1))));		//注意:计算层数的循环中sum+=2*(2*(i+1)-1)可能会多加一次,也就是多加两层的*的个数。
}


2.python实现:

#输入:
a,b=input().split()
num=int(a)

#行数:
sum = 1
floor = 1
while(sum<=num):
    sum+=2*(2*(floor+1)-1)
    if sum<=num:
        floor+=1

#上半部分输出:
for i in range(0,floor):
    for j in range(0,i):
        print(" ",end="")
    for k in range(0,(2*(floor-i)-1)):
        print(b,end="")
    print()

#下半部分输出:
for i in range(2,floor+1):
    for j in range(0,floor-i):
        print(" ",end="")
    for k in range(0,2*i-1):
        print(b,end="")
    print()

#剩余*个数:
print(num-(sum-2*(2*(floor+1)-1)))



以上是关于L1-002 打印沙漏 (20分)------使用c和python实现!的主要内容,如果未能解决你的问题,请参考以下文章

L1-002 打印沙漏 (20 分)天梯赛真题

题解PTA团体程序设计天梯赛L1-002 打印沙漏 (20 分) Go语言|Golang

L1-002 打印沙漏

L1-002. 打印沙漏

L1-002. 打印沙漏

CCCC L1-002. 打印沙漏图形打印