整型數字的反轉,溢位時返回零
阿新 • • 發佈:2019-01-01
轉載請標明出處,宣告轉載附上鍊接
例如:
輸入: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);空間複雜度:O(1)
程式碼示範如下:
#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;
}