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-----等差数列的问题或数学问题的主要内容,如果未能解决你的问题,请参考以下文章