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('\n');
    }
    printf("%d", N - 2 * h * h + 1);
    return 0;
}

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

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

2 * abs(h - 1 - i) + 1也是同样的对于这种数列题目的解释。

 

posted @ 2019-07-21 17:04  bananaman1  阅读(194)  评论(0编辑  收藏  举报