PAT1027-----等差数列的问题或数学问题

Posted bananaman

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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也是同样的对于这种数列题目的解释。

 

以上是关于PAT1027-----等差数列的问题或数学问题的主要内容,如果未能解决你的问题,请参考以下文章

求一个数学问题

PAT Basic 1013 数素数 (20) [数学问题-素数]

PAT 1030. 完美数列

PAT 1027 Colors in Mars (20分)

PAT——1030. 完美数列

PAT_B_1030_完美数列