【洛谷】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位的數據,我太難了(枯了)


偷瞄一下大佬的思路
在這裏插入圖片描述
看到這個,要被自己蠢哭了好嗎

未完待續。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章