zoukankan      html  css  js  c++  java
  • PAT1027-----等差数列的问题或数学问题

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

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

    所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

    给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

    输入格式:

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

    输出格式:

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

    输入样例:

    19 *
    

    输出样例:

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

    -------------------------------------------------------

    /**
    * 沙漏图形的特征:
    * 1. 上下对称;上半个沙漏符号数量 (1+3+5+...)
    * 可得出总符号数 N 和半个沙漏高度 H 的关系 ==> 2 * H * H - 1 <= N
    * 2. 上半部分每行空格数量递增 +1;符号数量递减 -2;下半部分相反
    * 每行的输出
    * 根据对称性,可以用绝对值函数 abs(),减少代码量;
    */

    以下为我自己的代码:

    #include <stdio.h>
    #include<string.h>
    #include<iostream>
    #include <math.h>
    #include <malloc.h>
    using namespace std;
    int main(){
        int n,h,flag=0;
        char x;
        cin>>n>>x;
        h=sqrt((n+1)/2.0);
        for(int i=h;i>0;i--)
        {
            for(int j=0;j<2*i-1;j++)
            {
                cout<<x;
            }
            if(i==1)
            {
                break;
            }
            flag++;
            cout<<endl;
            for(int j=0;j<flag;j++)
            {
                cout<<" ";
            }
        }
        flag--;
        for(int i=2;i<h+1;i++)
        {
            cout<<endl;
            for(int j=0;j<flag;j++)
            {
                cout<<" ";
            }flag--;
            for(int j=0;j<2*i-1;j++)
            {
                cout<<x;
            }
        }
        cout<<endl<<(n-2*h*h+1);
        return 0;
    }

    以为下为别人的代码:

    #include <stdio.h>
    #include <math.h>
    
    int main() {
        int N, h;//符号的数量 ,半个沙漏的高度 
        char sign; //符号 
        scanf("%d %c", &N, &sign);
        h = (int)sqrt((N+1) / 2.0);
        for (int i = 0; i < 2 * h - 1; i ++) {//输出每行内容 
            for (int j = 0; j < h - 1 - abs(h - 1 - i); j++) {
                printf(" ");
            } 
            for (int j = 0; j < 2 * abs(h - 1 - i) + 1; j++) {
                printf("%c", sign);
            } 
            putchar('
    ');
        }
        printf("%d", N - 2 * h * h + 1);
        return 0;
    }

    abs是绝对值函数,sqrt是开方的函数(括号内为double类型),

    关于h-1-abs(h-1-i),自己举个例子就可以总结出规律,

    2 * abs(h - 1 - i) + 1也是同样的对于这种数列题目的解释。
  • 相关阅读:
    ruby 二进制转十进制 Integer("0b101") = 5
    开始菜单和我的文档的我的图片及我的音乐变成 my pictrues 正常图标了
    ruby watir 莫名其妙的错误
    Excel SaveAS是去掉提示框
    apache && jboss安装
    ruby require include的区别
    ruby控制鼠标
    This error is raised because the column 'type' is reserved for storing the class in case of inheritance
    用正则表达式限制文本框只能输入数字,小数点,英文字母,汉字等各类代码
    ASP.NET 如何动态修改 Header 属性如添加 Meta 标签 keywords description!
  • 原文地址:https://www.cnblogs.com/BananaMan/p/11221791.html
Copyright © 2011-2022 走看看