【洛谷】P1553 数字反转(升级版)——被自己蠢哭了系列


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

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

输入样例1:5087462
输出样例1:2647805

输入样例2:600.084
输出样例2:6.48

输入样例3:700/27
输出样例3:7/72

输入样例4:8670%
输出样例4:768%


萌新上路,俺不知道啥叫STL,所以就自己动手,丰衣足食,嘿嘿。
打算用字符串来收数字,所以先写了一个char数字字符串转int的函数(用了指针的方法,转换从start到end之间的数字)

long long int trans(char* start,char* end)
{
	char* p=end;
	long long int ans=0,i=1;
	int len = end-start;
	while(p>=start)
	{
		ans += ((*p)-'0')*i;
		i*=10;
		p--;
	}
	return ans;
}

其实这个题从一开始就做错了,题目要求数值的最大长度20位,然而long long int最大约19位,unsigned long long虽然可以到20位,但是最大是18446744073709551615,很明显不行,不过最后只wa了一个测试点,就当涨经验了吧哈哈,不要在意这些细节,不对,是巨节

然后再写反转的函数

long long int reverse(long long int num)
{
	long long  ans=0,i=1,temp;
	while(num)
	{//每次都将ans的位数提高,再存入num的个位数部分
		temp = num%10;
		ans = ans*10 + temp;
		num/=10;
	}
	return ans;
}

输入数据(现在还是觉得当时有点憨)

char num[40];
gets(num);

之后遍历查找是否有符号,根据结果输出

	for(i=0;num[i];i++)
	{
		if(num[i]<'0'||num[i]>'9')
		{
			if(num[i]=='.')
			{
				printf("%lld.%lld",reverse(trans(num,num+i-1)),reverse(trans(num+i+1,num+strlen(num)-1)));
				return 0;
			}
			else if(num[i]=='/')
			{
				printf("%lld/%lld",reverse(trans(num,num+i-1)),reverse(trans(num+i+1,num+strlen(num)-1)));
				return 0;
			}
			else if(num[i]=='%')
			{
				printf("%lld%%",reverse(trans(num,num+i-1)));
				return 0;
			}
		}
	}
	//全都是数字的情况
	printf("%lld%",reverse(trans(num,num+strlen(num)-1)));
	return 0;

解释一下printf后面那一串奇怪的嵌套:
假如num为123.456
那翻转前三位123就可以写成

reverse(trans(num,num+2))

萌新觉得这很可

最后把上面那一堆串到一起

#include<iostream>
#include<cstring>
using namespace std;
long long int trans(char* start,char* end)
{
	char* p=end;
	long long int ans=0,i=1;
	int len = end-start;
	while(p>=start)
	{
		ans += ((*p)-'0')*i;
		i*=10;
		p--;
	}
	return ans;
}

long long int reverse(long long int num)
{
	long long  ans=0,i=1,temp;
	while(num)
	{
		temp = num%10;
		ans = ans*10 + temp;
		num/=10;
	}
	return ans;
}
int main()
{
	char num[40];
	gets(num);
	int i;
	for(i=0;num[i];i++)
	{
		if(num[i]<'0'||num[i]>'9')
		{
			if(num[i]=='.')
			{
				printf("%lld.%lld",reverse(trans(num,num+i-1)),reverse(trans(num+i+1,num+strlen(num)-1)));
				return 0;
			}
			else if(num[i]=='/')
			{
				printf("%lld/%lld",reverse(trans(num,num+i-1)),reverse(trans(num+i+1,num+strlen(num)-1)));
				return 0;
			}
			else if(num[i]=='%')
			{
				printf("%lld%%",reverse(trans(num,num+i-1)));
				return 0;
			}
		}
	}
	printf("%lld%",reverse(trans(num,num+strlen(num)-1)));
	return 0;
}

最后系统判定95分
在这里插入图片描述
第14个测试点数据是:12345678910111213140
20位的数据,我太难了(枯了)


偷瞄一下大佬的思路
在这里插入图片描述
看到这个,要被自己蠢哭了好吗

未完待续。。。。

发布了38 篇原创文章 · 获赞 4 · 访问量 1642

猜你喜欢

转载自blog.csdn.net/qq_15989473/article/details/103373424
今日推荐