花花生米

导航

字符串题单

第一题(小写字母转大写字母输出):

2020.8.15
水题一道
输入一个长度不超过 100 且不包括空格的字符串。要求将该字符串中的所有小写字母变成大写字母并输出。

#include <bits/stdc++.h>

using namespace std;


int main()
{
	
	string aa;
	cin >> aa;
	for (int i = 0; i < aa.size(); i++)
	{
		aa[i] = toupper(aa[i]);//toupper()是将小写字母转换为大写字母
	}
	cout << aa;
	
}

第二题(数值转换)

2020.8.15
题目:给定一个数,请将该数各个位上数字反转得到一个新数。

这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。整数反转是将所有数位对调;小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分;分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母;百分数的分子一定是整数,百分数只改变数字部分。整数新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零;小数新数的末尾不为0(除非小数部分除了0没有别的数,那么只保留1个0);分数不约分,分子和分母都不是小数(约分滴童鞋抱歉了,不能过哦。输入数据保证分母不为0),本次没有负数。

输入输出例子:
输入:8.0300600 输出:8.6003
输入:5087462 输出:2647805
输入:700/27 输出:7/72
输入:8670% 输出:768%
输入:8.0 输出:8.0

#include <iostream>
#include <cmath>
#include <cstdio>
#include <string>
#include <algorithm>


using namespace std;

//A.
//将小写字母转换为大写字母
//int main()
//{
//	
//	string aa;
//	cin >> aa;
//	for (int i = 0; i < aa.size(); i++)
//	{
//		aa[i] = toupper(aa[i]);
//	}
//	cout << aa;
//	
//}


//B.
//此题是关于反转问题,涉及正整数,小数,百分数,分数;对于不同类型的数反转方法不同;在这四种类型的数值中只有小数会涉及后导零;
//正整数:直接用stl中的reverse函数进行反转,但下列代码是自写一个反转函数,因为可能存在反转后前面第一位是0,所以需要删除掉;
//分数:根据题目要求,是对分号两侧的数字分别进行反转,遍历字符串,找到分号所在的位置,分子则提取开始下标到分号区间的数值进行反转,分母从分号+1后的开始提取子字符串;
//关于提取子字符串需要用到stl中的substr函数;
//小数:小数会涉及到后导零的情况,所以需要再写一个函数进行操作,其余与分数的操作相同;
string reverse0(string ss)//自函数
{
	int ans = 0;
	reverse(ss.begin(), ss.end());//函数反转
	for (char i : ss)
	{
		if (i == '0')++ans;
		else break;
	}
	ss.erase(ss.begin(), ss.begin() + ans);//进行之间删0
	return (ss != "" ? ss : "0");//空字符串
}

string tail0(string ss)
{
	int ans = 0;
	for (int i = ss.length() - 1; i >= 0; --i)
	{
		if (ss[i] == '0')
			++ans;
		else break;
	}
	ss.erase(ss.end()-ans, ss.end());//删除后面滴0
	return (ss!=""?ss:"0");
}
//题意是反转数字,可以是百分数,小数,分数,正整数
int main()
{
	string ss;
	getline(cin, ss);

	//分数的反转,用分号分成左右两边,各自反转,最后一并输出;
//先遍历字符串,寻找分号所在的下标位置
	for (char i : ss)
		//写这部分自己太憨憨了,开始不想调用自函数,想直接用stl中的函数,后面发现一个类型数需要操作前后删0操作,这样for这一部分具有相同的操作,用自函数更省事
		//其中还涉及到另一个函数find(),从前往后找到所想找的子串或者字符出现的位置
	{
		if (i == '/')
		{
			string left, right;
			left = ss.substr(0, ss.find("/"));
			right = ss.substr(ss.find("/") + 1);
			cout << reverse0(left) << "/" << reverse0(right) << endl;
			return 0;
		}
		if (i == '.')//反转小数
		{
			string left, right;
			left = ss.substr(0, ss.find("."));
			right = ss.substr(ss.find(".") + 1);
			cout << reverse0(left) << "." << tail0(reverse0(right)) << endl;//注意小数需要考虑前后0!!!!
			return 0;
		}
	}

	//如果是百分数,先按正整数反转,再将百分号输出,其中涉及到提取子字符串的方法,substr();
	if (ss.back() == '%')
	{
		
		cout << reverse0(ss.substr(0, ss.size() - 1)) << "%" << endl;//提取子字符串进行反转
		return 0;
	}
	
	cout <<reverse0(ss) << endl;
	return 0;
}

posted on 2020-08-15 14:37  花花生米  阅读(245)  评论(0编辑  收藏  举报