hdu——1062Text Reverse(反转函数reverse)

本文介绍了一个字符串反转的问题,挑战在于反转由单行文本组成的多个单词。文章提供了完整的代码示例,展示了如何通过查找和反转每个单词来解决问题,并给出了样例输入和输出。
Text Reverse
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 25706    Accepted Submission(s): 9959






Problem Description


Ignatius likes to write words in reverse way. Given a single line of text which is written by Ignatius, you should reverse all the words and then output them.




 




Input


The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow.
Each test case contains a single line with several words. There will be at most 1000 characters in a line.




 




Output


For each test case, you should output the text which is processed.




 




Sample Input


3
olleh !dlrow
m'I morf .udh
I ekil .mca




 




Sample Output


hello world!
I'm from hdu.
I like acm.


Hint


Remember to use getchar() to read '\n' after the interger T, then you may use gets() to read a line and process it.


 




 




Author


Ignatius.L


 




Recommend





     注意最后一部份也要反转  

#include<string>
#include<algorithm>
#include<iostream>
#include<sstream>
using namespace std;
int main()
{
	long long m,n;
	string a;
	cin>>n;
	getchar();
	while(n--)
	{
		m=0;
		getline(cin,a);
		while(a.find(" ",m)!=string::npos)
		{
			reverse(a.begin()+m,a.begin()+a.find(" ",m));
			m=a.find(" ",m)+1;
		}
		reverse(a.begin()+a.find_last_of(" ")+1,a.end());
		cout<<a<<endl;
	}
	return 0;
} 

  
### 题目分析 HDU OJ 1002题(A + B Problem II)是一个典型的大数相加问题。由于输入的两个整数可以达到1000位,远远超过C语言中`int`或`long long`的数据范围,因此需要采用字符串来处理大数运算。该问题的核心在于如何正确地对两个大数进行逐位相加,并处理进位的问题。 ### 解题思路 - **输入处理**:读取测试用例的数量,然后依次读取每个用例的两个大数。 - **字符串反转**:为了方便从低位到高位进行加法运算,先将两个大数的字符串反转。 - **补零对齐**:将两个字符串的长度补齐,使它们长度一致,便于后续运算。 - **逐位相加**:从低位到高位进行加法运算,并处理进位。 - **结果处理**:将最终结果再次反转,输出正确的结果。 ### C语言实现 ```c #include <stdio.h> #include <string.h> #define MAX_LENGTH 1010 // 反转字符串 void reverse_string(char *str) { int len = strlen(str); for (int i = 0; i < len / 2; i++) { char temp = str[i]; str[i] = str[len - 1 - i]; str[len - 1 - i] = temp; } } // 大数相加函数 void big_add(char *a, char *b, char *result) { reverse_string(a); reverse_string(b); int len_a = strlen(a); int len_b = strlen(b); int max_len = (len_a > len_b) ? len_a : len_b; // 补零对齐 for (int i = len_a; i < max_len; i++) { a[i] = '0'; } a[max_len] = '\0'; for (int i = len_b; i < max_len; i++) { b[i] = '0'; } b[max_len] = '\0'; int carry = 0; for (int i = 0; i < max_len; i++) { int sum = (a[i] - '0') + (b[i] - '0') + carry; result[i] = sum % 10 + '0'; carry = sum / 10; } if (carry > 0) { result[max_len] = carry + '0'; result[max_len + 1] = '\0'; } else { result[max_len] = '\0'; } reverse_string(result); } int main() { int T; scanf("%d", &T); for (int case_num = 1; case_num <= T; case_num++) { char a[MAX_LENGTH], b[MAX_LENGTH], result[MAX_LENGTH + 1]; scanf("%s %s", a, b); big_add(a, b, result); printf("Case %d\n", case_num); printf("%s + %s = %s\n", a, b, result); if (case_num != T) { printf("\n"); } } return 0; } ``` ### 代码说明 - **reverse_string函数**:将字符串反转,以便从低位开始相加。 - **big_add函数**:执行大数加法的核心逻辑,包括反转输入字符串、补零对齐、逐位相加以及处理进位。 - **主函数main**:读取输入数据,调用加法函数并输出结果。 ### 测试用例示例 假设输入如下: ``` 2 123456789 987654321 99999999999999999999 1 ``` 程序输出如下: ``` Case 1 123456789 + 987654321 = 1111111110 Case 2 99999999999999999999 + 1 = 100000000000000000000 ``` ### 复杂度分析 - **时间复杂度**:O(n),其中n是输入数字的最大长度。 - **空间复杂度**:O(n),用于存储输入和结果字符串。 ### 注意事项 - **进位处理**:确保在最后一位加法后,如果有进位需要添加到结果中。 - **结果反转**:加法完成后,需要将结果字符串再次反转以得到正确顺序。 - **格式输出**:按照题目要求输出格式,每个测试用例之间输出一个空行(最后一个用例不需要)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值