P5730 【深基5.例10】显示屏 - 字符表问题( 二 )


也就是说,例如有1 2 3 4 5,1+4和2+3都等于5,但是只能算一个
#include#include#include#include#includetypedef long long LL;const int N=1e5+10;using namespace std;int n;int ans[N],num[N];int main(){cin>>n;for(int i=0;i>ans[i];num[ans[i]]=1;//用于检测是否用过}int sum=0;for(int i=0;i
P1553 数字反转(升级版)- 细节
给定一个数,请将该数各个位上数字反转得到一个新数 。
这次与普及组第一题不同的是:这个数可以是小数,分数,百分数,整数 。整数反转是将所有数位对调;小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分;分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母;百分数的分子一定是整数,百分数只改变数字部分 。整数新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零;小数新数的末尾不为0(除非小数部分除了0没有别的数,那么只保留1个0);分数不约分,分子和分母都不是小数(约分滴童鞋抱歉了,不能过哦 。输入数据保证分母不为0),本次没有负数 。
题目描述
给定一个数,请将该数各个位上数字反转得到一个新数 。
这次与普及组第一题不同的是:这个数可以是小数,分数,百分数,整数 。
输入格式
一个数s
输出格式
一个数,即s的反转数

P5730 【深基5.例10】显示屏 - 字符表问题

文章插图
算法核心在于去掉前导零 。
而整数部分、小数部分反转后,去除前导零的规则不同,需要分别讨论 。
整数反转去除前导零:先将整数存成字符串s,然后从s[s.()-1]向s[0]遍历,若至s[0]还是0,就输出0 。
小数反转去除前导零:先将小数存成字符串s,然后从s[0]向s[s.()-1]遍历,若至s[s.()-1]还是0,就输出0 。
错误写法:75分
由数字反转改编的写法,大致思路是分成三部分,左右各反转一次,中间字符直接输出
#include#include#include#include#includetypedef long long LL;const int N = 1e5 + 10;using namespace std;int a[N], n;int fz(string fzs){int sz = 0,len=0;for (int i = 0; fzs[i] != '\0'; i++){len++;}for (int i = len - 1; i >= 0; i--){sz *= 10;sz += fzs[i] - '0';}return sz;}int main(){string s1, s3, s;char s2;int flag = 0, i, k = 0;cin >> s;s1 = s3 = s;for (i = 0; i < s.length(); i++){if (s[i] < '0' || s[i]>'9'){flag = 1;s1[i] = '\0';break;}s1[i] = s[i];}if (flag == 0){int ret = fz(s1);cout << ret;}else{s2 = s[i];for (++i; s[i] != '\0'; i++){s3[k++] = s[i];}s3[k] = '\0';int ret1 = fz(s1);if(s2=='%'){cout<
这样写的话当遇到600.084 会返回6.480;无法去除前导0
AC写法:(只能一步步细节死磕)
#includeusing namespace std;int main(){string s;char p=0;//放符号 int cnt=0; cin>>s;for(int i=0;i='0'&&s[i]<='9') cnt++;//记录第一个数长度else//遇到符号,记录,跳出 {p=s[i];break;} }int x=cnt;//记下第一个数末后一个的位置,也就是符号的位置,如果是分数或小数就要用 cnt--;while(s[cnt]=='0'&&cnt>0) cnt--;//去除多余前导0; for(int i=cnt;i>=0;i--)//输出第一个数 coutx;i--)//输出第二个数 cout<
P1205 [.2]方块转换- 暴力模拟
3@-@---@@-@-@@----@
我地马呀,非常暴力的模拟题,嘎嘎一顿敲就完事儿了
《一题彻底搞懂模拟》
#include