本文主要是介绍PAT 1027. 打印沙漏(20),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目概述:
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
******* *****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
******* ***** 2
思路:
这题目有点像找规律
我的做法是把1000内每层相加的符号和计算出来
然后再根据输入得出层数
根据层数进行空格和符号的输出
这道题一开始以为要两边空格对称,但其实只要开头即可。
#include<stdio.h>
#include<string.h>int N;
char c;
int layout;
int sum[1005];
int blank;void all() {sum[1] = 1;int interval = 6;for (int i = 2;i <= 1000;i++) {sum[i] = sum[i - 1];sum[i] += interval;interval += 4;}
}//只是开头空格
int main() {all();scanf("%d %c", &N, &c);//calculate the layoutfor (int i = 1; i <= 1000; i++){if (N == 1) {layout = 1;break;}if (N <= sum[i]){layout = i - 1;break;}}int temp = layout;int symbol;blank = 0;for (int i = temp; i > 0; i--){symbol = 2 * i - 1;temp = blank;for (int j = symbol; j > 0; j--){for (blank;blank > 0;blank--)printf(" ");printf("%c", c);}printf("\n");blank = temp;blank += 1;}blank -= 1;for (int i = 2; i <= layout; i++){blank -= 1;temp = blank;symbol = 2 * i - 1;for (int j = symbol; j > 0; j--) {for (blank;blank > 0;blank--)printf(" ");printf("%c", c);}printf("\n");blank = temp;}printf("%d", N - sum[layout]);return 0;
}
这篇关于PAT 1027. 打印沙漏(20)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!