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也是同样的对于这种数列题目的解释。
  • 相关阅读:
    微信红包开发
    第一次开博客,留此纪念
    数据结构--树(遍历,红黑,B树)
    c++之vector
    动态规划求解最长公共子序列问题
    c++之map
    k-折交叉验证(k-fold crossValidation)
    prim算法
    快速排序算法
    浙大机试题目
  • 原文地址:https://www.cnblogs.com/BananaMan/p/11221791.html
Copyright © 2011-2022 走看看