• 打印沙漏


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

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

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

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

    输入样例:
    19
    输出样例:



    2
    1)实验代码

    include "stdio.h"

    int main()
    {
    int n;
    int x , z;
    int i, s, b;
    char c;
    scanf("%d %c",&n,&c);
    for (x = 3; ;x =x + 2)
    {
    z = (1 + x)(x / 2 + 1)-1;
    if (z >= n)
    break;
    }
    x = x-2;
    s=x;
    b=1;
    while(x >= 1)
    {
    for(i = 1;i < b; i++ )
    printf(" ");
    for(i = 1;i <= x; i++)
    printf("%c",c);
    printf(" ");
    x=x-2;
    b++;
    }
    b=b-2;
    x=x+4;
    while(x<=s)
    {
    for(i = 1; i <b ; i++)
    printf(" ");
    for(i=1 ; i <= x ; i++)
    printf("%c",c);
    printf(" ");
    x=x+2;
    b--;
    }
    x=x-2;
    z = (1 + x)
    (x / 2 + 1)-1;
    printf("%d " , n-z);
    return 0;
    }

    }2) 设计思路
    首先找一下规律:***** 5
    *** 3
    * 1
    *** 3
    ***** 5
      其实这个漏斗是一个等差数列:5 3 1 3 5.公差为2,首项为1,但是是对称的。
      那么题目和代码中给定的n就是和了。我们想知道对于一个给定的n,我们在尾项(x)为多少,或者说有多少项((x/2+1)2,也就是后面的h2-1)的时候能够使得和z(代码中理解为面积)能够满足小于n,并且使得这个x最大,所以一开始从3开始,一直求一个最大的x(尾项),使得和能够满足。但是要注意的是当判断出这个尾项x的时候,x已经不满足了!前一个x才是我们想要的,所以要x-2.

      至于b,代码中理解为行。我理解为项数,比如说b=3,那么就是有3行:1 3 5.但是要打印漏斗状,所以要对称,还要再打印一行。

    运行结果截图

  • 相关阅读:
    openstack计算节点nova
    openstack控制节点nova
    openstack镜像服务glance
    openstack验证服务keystone
    openstack基础环境
    关于mysql中like查询是否通过索引的测试
    并发编程的优缺点
    mybatis中namespace配置方式
    开通技术博客的第一天
    ajax的使用
  • 原文地址:https://www.cnblogs.com/ZJ999999/p/10414650.html
Copyright © 2020-2023  润新知