PAT-乙-1027 1027 打印沙漏 (20 分)

在这里插入图片描述
在这里插入图片描述

代码

#include <iostream>

using namespace std;

int main(){
	
	int n;
	char c;
	cin>>n>>c;
	
	int sum = 1;
	int lastSum = 1;
	int pos = 1;
	int tmp = 3;
	while(n>=sum){
		lastSum = sum;
		sum += tmp*2;
		tmp += 2;
		pos++;
	}
	int remain = n - lastSum;
	if(pos>1){
		pos--;
	}
	
	int max = pos;
	int width = 2*pos-1;
	while(pos>0){
		int nowLine = 2*pos-1;
		for(int i=0; i<(width-nowLine)/2; i++){
			cout<<" ";
		}
		for(int i=0; i<nowLine; i++){
			cout<<c;
		}
		cout<<endl;
		pos--;
	}
	pos+=2;
	while(pos<=max){
		int nowLine = 2*pos-1;
		for(int i=0; i<(width-nowLine)/2; i++){
			cout<<" ";
		}
		for(int i=0; i<nowLine; i++){
			cout<<c;
		}
		cout<<endl;
		pos++;
	}
	
	cout<<remain<<endl;
	
	return 0;
} 

注解

1、先找出来与输入最接近的符合题意的个数
找的方法有两种:
(1)像该代码这种找法,每次手动找。
(2)如有多组输入,需要多次查找太耗时,可采用打表法,事先把该数组的内容计算出来,打表。这样节约时间!

/*
	int a[] = {0, 1, 7, 17, 31, 49, 71, 97, 127, 161, 199, 241, 287, 337, 391, 449, 511, 577, 647, 721, 799, 881, 967, 1057};
	int len = sizeof(a)/sizeof(a[0]);
	
	
	int remain;
	int pos;
	
	for(int i=0; i<len-1; i++){
		if(a[i]<=n && a[i+1]>n){
			remain = n - a[i];
			pos = i;
			break;
		}
	}*/

2、此题有个小坑点,就是行末不能有多余空格,也就是,开头是一堆空格,然后是沙漏字符,就结束了!不能再添加一些空格在行尾。否则会有2个case是Wrong Answer!
每行字符的个数是2*pos-1,空格的个数就是width减字符的个数,再除以2(左右对称)
3、学到的语法:
数组长度用sizeof计算:int len = sizeof(a)/sizeof(a[0]);

结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zhanggirlzhangboy/article/details/82939215