PAT甲级 1031 Hello World for U (20分)

1031 Hello World for U (20分)

题目链接:PAT A 1031
在这里插入图片描述

题目大意:给出一个字符串,要求打印为U型输出。

思路分析:一般图形打印题都是数学找规律题。最左面一列从上到下字符数为n1,下面一行从左到右字符数为n2,最右面一列从上到下字符数为n3。由于最下面一行最左面的字符和最左面一列最下面字符冲突,最下面一行最右面的字符和最右面一列最下面字符冲突,所以总字符数是n1+n2+n3-2。这个U型的要求就是n1要等于n3等于最大的一个数k,这个数k是小于等于n2的(n2大于等于3小于总字符数n1+n2+n3-2),所以我们要找出数k的最大值。所以让n2从3开始自增,由于n1等于n3,即可求出n1的值,一开始n1是最大的,随着n2的增大,n1会逐渐减小,当n1达到小于或等于n2的第一个数时,就跳出循环,此时n1是小于或等于n2的最大的n1,这个n1就是我们要求的n1,n3是等于n1的。随后按照题目要求的图形输出即可~

AC代码:

#include<iostream>
using namespace std;
int main() {
	string s;
	cin >> s;
	int n1, n2;
	for(n2 = 3; n2 < s.size(); n2++) { 
		if((s.size() + 2 - n2) % 2 != 0) //这个数必须为偶数,否则不满足n1=n3的条件 
			continue;
		else {
			n1 = (s.size() + 2 - n2) / 2;
			if(n1 <= n2) //找到使n1小于等于n2的最大的n1 
				break;
		} 
	}
	for(int i = 0; i < n1 - 1; i++) { //输出图形 
		cout << s[i];
		for(int j = 0; j < n2 - 2; j++)
			cout << " ";
		cout << s[s.size() - 1 - i] << endl;
	}
	for(int i = n1 - 1; i < n1 + n2 - 1; i++) //由于最下面一行有n2个字符,而最左面字符下标是n1-1,所以i自增到n1+n2-1 
		cout << s[i];
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值