题目描述
给定一个数,请将该数各个位上数字反转得到一个新数。
这次与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位的数据,我太难了(枯了)
偷瞄一下大佬的思路
看到这个,要被自己蠢哭了好吗
未完待续。。。。