洛谷 P5705 数字反转 P1553 数字反转(升级版)字符串 输入输出 数学 前导零 后导零

简简单单一个小入门题,看到了让我惊讶的好几种做法,分享一下。

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!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三元湖有大锦鲤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值