简简单单一个小入门题,看到了让我惊讶的好几种做法,分享一下。
P5705 输入一个三位数,带有一位小数,把这个数反过来输出。
例如,输入123.4,输出4.321
我的第一反应是以字符串类型输进去,然后倒着输出来。
这样:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
char s[5];
for(int i=0;i<5;i++)
cin >> s[i];
for(int i=4;i>=0;i--)
cout << s[i];
return 0;
}
然后看到某个过去,我曾提交过一次这个题。我是这样做的:
#include<iostream>
using namespace std;
int main()
{
double num;
cin >> num;
int a,b,c,d;
a = (int)(num*10)%10;
b = (int)num%10;
c = (((int)num-b)/10)%10;
d = (int)num/100;
cout <<a<<"."<<b<<c<<d;
return 0;
}
果然,代码的风格在短时间就有了很大的变化。
可,这两种方法还都可以优化。
上STL大法:
reverse(s.begin(),s.end())把字符串反转,是不是显得高大上了一些。(还好)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
string s;
cin >> s;
reverse(s.begin(),s.end());
cout << s;
return 0;
}
别忘了最厉害的C的格式化输入输出:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
char a,b,c,d;
scanf("%c%c%c.%c",&a,&b,&c,&d);
printf("%c.%c%c%c",d,c,b,a);
return 0;
}
这个题做到这里也算是可以了,数字反转可是让我给活生生盘成了这样。
接着,我又让数字反转他爹(数字反转(升级版))给盘了。。。。
P1553的数字反转(升级版)比上一个题复杂多了。
先看条件:
(1):整数去掉后导零,然后反转。
(2):小数,小数点前去掉后导零,后去掉前后的零,然后分别反转。
(3):分数,除号前去掉后导零,后去掉前后的零,然后分别反转。
(4):百分数,去掉后导零,反转后加上百分号。
复杂但易实现:
我们一点点来看。
大体思路:输入,判断,对应改变,输出。
输入好办,定义一个字符串,然后输入:
string s;
cin >> s;
然后记录一下到符号时的位置:
char p;
int cnt=0;
for(int i=0;i<s.size();i++)
{
if(s[i]>='0'&&s[i]<='9')
cnt++;
else
{
p = s[i];
break;
}
}
int x = cnt;
cnt--;
去除后导零:
while(s[cnt]=='0'&&cnt>0) cnt--;
符号之前的反转后的数:
for(int i=cnt;i>=0;i--)
cout << s[i];
然后判断类型,如果是整数了,直接返回值0,百分数输出%再返回0,小数和分数另作判断:
if(p==0) return 0;
else if(p=='%')
{
cout << p;
return 0;
}
else
cout << p;
如果是小数或者分数:,去掉前后的0,输出:
int m = s.size()-1;
while(s[x+1]=='0'&&x<m-1) x++;
while(s[m]=='0'&&m>x+1) m--;
for(int i=m;i>x;i--)
cout << s[i];
大体想法就是这样,代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
string s;
cin >> s;
char p;
int cnt=0;
for(int i=0;i<s.size();i++)
{
if(s[i]>='0'&&s[i]<='9')
cnt++;
else
{
p = s[i];
break;
}
}
int x = cnt;
cnt--;
while(s[cnt]=='0'&&cnt>0) cnt--;
for(int i=cnt;i>=0;i--)
cout << s[i];
if(p==0) return 0;
else if(p=='%')
{
cout << p;
return 0;
}
else
cout << p;
int m = s.size()-1;
while(s[x+1]=='0'&&x<m-1) x++;
while(s[m]=='0'&&m>x+1) m--;
for(int i=m;i>x;i--)
cout << s[i];
return 0;
}
OK!