第一题(小写字母转大写字母输出):
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;
}