1. 程式人生 > >整型數字的反轉,溢位時返回零

整型數字的反轉,溢位時返回零

轉載請標明出處,宣告轉載附上鍊接

例如:

輸入:123;輸出:321;

輸入:1534236469;輸出:0;

對於這個題,第一反應是位數分離,取出每位上的數字,放在一個數組裡,然後反轉;後來發現這樣的方法較為低效,後來發現可以在取各個位上的數字時,同時反轉,這樣較為高效(時空複雜度更低)然後第一次做的時候:用了一種錯誤的資料溢位判斷方式

判斷溢位錯誤方式:n是輸入的數)

while(n!=0)

{

b=b*10+n%10;//n%10為分離的各位上的數(從個位開始),b*10表示每次將各位上的數左移一位(進位)

n=n/10;

if(b>max||b<min)

{

b=0;break;

}

這樣判斷,在迴圈體第一個語句中

b的值已經改變了(可能已經成為了溢位的資料,不知道會變成那個數字,,所以下面的if判斷語句中b的值可能已經溢位了,變成了一個不可知的數字,所以那時的判斷顯得無用)

正確的判斷應該是:將迴圈體中進位後得到的數字(設為m),判斷進位前的數字是否和用現在的數字(m)回推得到的數字相同,不同則表示資料已經溢位了。

時間複雜度:O(n);空間複雜度:O1

程式碼示範如下:

#include<stdio.h>
#include<math.h>
int f1(int n)
{
	//signed int max=2147483647;整型資料int的上界
	//signed int min=-2147483648;下界
	signed b;//最終反轉結果
	b=0;
	int t;//判斷正負的標記
	t=1;//當n為正數
	if(n<0)
	{n=-n;t=-1;}
	while(n!=0)
	{
		int x=n%10;
		int m=int(b*10+x);//n%10為分離的各位上的數(從個位開始),b*10表示每次將各位上的數左移一位(進位)
		if((m-x)/10!=b)//-判斷是否溢位,不相等則溢位
			return 0;
		b=m;
		n=(n/10);
	}
	return (t*b);
}
int main()
{	int n;
	int b;
	printf("輸入值:");
	scanf("%d",&n);//輸入值
	b=f1(n);
	printf("輸出反轉結果為:");
	printf("%d\n",b);
	return 1;
}