1031. Hello World for U (20)-PAT

本文介绍了一种将任意长度的字符串以U形排列的方式打印的算法。该算法首先确定最佳的行列分布,确保U形尽可能地接近正方形,并按原始顺序从顶部垂直向下、底部从左向右、再从底部垂直向上输出字符。

1031. Hello World for U (20)

时间限制
400 ms
内存限制
32000 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

Given any string of N (>=5) characters, you are asked to form the characters into the shape of U. For example, "helloworld" can be printed as:

h  d
e  l
l  r
lowo
That is, the characters must be printed in the original order, starting top-down from the left vertical line with n1characters, then left to right along the bottom line with n2 characters, and finally bottom-up along the vertical line with n3 characters. And more, we would like U to be as squared as possible -- that is, it must be satisfied that n1 = n3 = max { k| k <= n2 for all 3 <= n2 <= N } with n1 + n2 + n3 - 2 = N.

Input Specification:

Each input file contains one test case. Each case contains one string with no less than 5 and no more than 80 characters in a line. The string contains no white space.

Output Specification:

For each test case, print the input string in the shape of U as specified in the description.

Sample Input:
helloworld!
Sample Output:
h   !
e   d
l   l
lowor
推荐指数:※
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
#define  N 81
int main()
{
	int i,j,n,n1,n2,n3;
	char str[N];
	cin.get(str,N);
	n=0;
	while(str[n]!='\0')
		n++;
	n1=(n+2)/3-1;
	n2=n-2*n1;
	for(i=0;i<n1;i++){
		cout<<str[i];
		for(j=0;j<n2-2;j++)
			cout<<" ";
		cout<<str[n-i-1]<<endl;
	}
	for(j=i;j<n-i;j++)
		cout<<str[j];
	return 0;
}


1. 概述.............................................................................................................................................1 1.1. 自然语言&计算机语言................................................................................................1 1.2. 计算机语言 & C/C++语言..........................................................................................2 1.3. 简单的C/C++程序及其运行方法(环境的使用)................................................2 1.3.1. C/C++程序开发运行环境....................................................................................2 1.3.2. 格式输出函数printf()和格式输入函数scanf()....................................................3 1.4. 习题..............................................................................................................................5 2. 基本的C语言................................................................................................................................6 2.1. C语言中的名词——类型、量值(常量和变量)....................................................6 2.1.1. 整型和整型量值...................................................................................................6 2.1.2. 浮点型和浮点量(常量和变量).......................................................................8 2.1.3. 字符型和字符量(常量和变量).......................................................................9 2.1.4. 字符串常量.........................................................................................................10 2.2. C语言中的动词—运算符,短语-表达式 和和特殊动词性关键字....................11 2.2.1. 赋值运算符和赋值表达式.................................................................................11 2.2.2. 算术运算符和算术表达式.................................................................................12 2.2.3. 逻辑运算符和逻辑表达式.................................................................................13 2.2.4. 关系运算符和关系表达式.................................................................................14 2.2.5. 其它运算符和表达式.........................................................................................15 2.2.6. 不同类型量值的不同运算的混合.....................................................................17 2.3. C语言中的连词及句子——分支、循环和顺序语句..............................................19 2.3.1. if-else:如果-那么...........................................................................................19 2.3.2. switch-case语句..................................................................................................21 2.3.3. ?-:语句................................................................................................................23 2.3.4. for........................................................................................................................23 2.3.5. while....................................................................................................................24 2.3.6. do-while..............................................................................................................25 2.3.7. goto-label-if.........................................................................................................26 2.3.8. break....................................................................................................................27 2.3.9. continue...............................................................................................................28 2.4. C语言中的句子小结..................................................................................................28 2.5. 用C语言写一段话——程序段..................................................................................29 2.6. 用C语言写复杂段落——语句嵌套..........................................................................29 2.6.1. 复杂段落——语句嵌套的含义.........................................................................29 2.6.2. 嵌套语句的示例.................................................................................................30 2.6.3. 复杂段落——语句嵌套的小结.........................................................................33 2.7. 总结............................................................................................................................33 习题...........................................................................................................................................34 3. C语言的横向名词性扩充..........................................................................................................34 3.1. C语言的横向名词性扩充(1):同类变量的集合——数组..................................34
<think>首先,用户的问题是查询C++中字符串“hello world!”所占的字符数量。字符串是“hello world!”,注意这里有感叹号。 在C++中,字符串占用多少字符取决于它的编码和存储方式。标准C++字符串使用ASCII或UTF-8编码时,每个字符占用一个字节。 字符串“hello world!”包括: - 字符:h, e, l, l, o, space, w, o, r, l, d, ! - 计数: - "hello" 是 5 个字符 - 空格 1 个字符 - "world" 是 5 个字符 - "!" 是 1 个字符 总字符数:5 (hello) + 1 (space) + 5 (world) + 1 (exclamation) = 12 个字符。 在C++中,定义一个字符串如 `std::string str = "hello world!";`,其长度是12,因为字符串字面量以空字符结束,但 `std::string` 的长度函数 `str.length()` 返回的是字符数不包括结尾的空字符。 所以,直接回答:字符串“hello world!”在C++中占用12个字符。 现在,回顾系统级指令: - 所有行内数学表达式必须使用 `$...$` 格式。 - 独立公式使用 `$$...$$` 并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 引用的段落末尾自然地添加引用标识。 用户提供了几个引用,但主要是关于PAT甲的“Hello World for U”问题,似乎与当前问题无关。用户说:“上述引用仅供参考,并不是用户真正的需求。” 所以,我应该专注于用户当前的问题:查询字符串“hello world!”所占的字符数量。 用户上一次的问题是同样的主题,所以不需要历史上下文。 回答结构: - 解释字符串字符计数。 - 可能需要提到C++中的字符串长度函数。 - 生成相关问题。 确保使用中文回答。 步骤: 1. 直接回答问题:字符串的长度是12个字符。 2. 解释原因:逐个字符计数。 3. 提及C++代码示例如何获取长度。 4. 生成相关问题。 相关问题生成: - 基于字符串长度和C++字符串操作。 - 例如: 1. 如何在C++中获取字符串的长度? 2. 字符串编码对字符计数有什么影响? 3. 如何手动计算字符串的字符数而不使用内置函数? 引用:用户提供了引用[1]到[5],但它们是关于“Hello World for U”问题的,不相关。用户提到“上述引用仅供参考”,所以我不需要引用它们。如果我不引用这些,就不添加引用标识。只有在引用时才添加。 在回答中,除非我具体引用某个部分,否则不需要加引用标识。这里,我不需要引用那些内容。 最终回答大纲: - 引言:在C++中,字符串“hello world!”所占的字符数量是12。 - 解释:字符串由12个可见字符组成:"hello" (5), 空格 (1), "world" (5), 和 "!" (1)- C++代码示例:展示如何用 `str.length()` 获取长度。 - 生成相关问题。 </think>在C++中,字符串“hello world!”所占的字符数量取决于字符串的实际内容和编码方式。假设使用标准ASCII或UTF-8编码(这是C++中常见的默认设置),字符串中的每个字符(包括字母、空格和标点)占用1个字节的存储空间,但不包括字符串结尾的空字符(`'\0'`)。字符串“hello world!”的详细字符组成如下: - "hello":5个字符 - 空格:1个字符 - "world":5个字符 - "!":1个字符 总字符数为:$5 + 1 + 5 + 1 = 12$。 在C++中,可以使用 `std::string` 类的 `length()` 或 `size()` 成员函数来直接获取字符串的字符数量。以下是一个简单的代码示例: ```cpp #include <iostream> #include <string> using namespace std; int main() { string str = "hello world!"; // 定义字符串 int charCount = str.length(); // 获取字符数量 cout << "字符串占用的字符数量: " << charCount << endl; // 输出结果 return 0; } ``` 运行此代码将输出:`字符串占用的字符数量: 12`。 需要注意的是: - 如果字符串包含多字节字符(如中文或Emoji),在UTF-8编码中一个字符可能占用多个字节,但字符数量仍由 `str.length()` 返回的字节数决定(如果全是ASCII字符,则字节数与字符数一致)。 - 在C++中,`str.length()` 返回的是字符串的有效字符数,不包括结尾的空字符。因此,对于“hello world!”,结果总是12个字符。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值