題目描述
給定一個數,請將該數各個位上數字反轉得到一個新數。
這次與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位的數據,我太難了(枯了)
偷瞄一下大佬的思路
看到這個,要被自己蠢哭了好嗎
未完待續。。。。