一道整数转换的题目,这里需要掌握int的范围,int是32bit带符号,因此是-2^31~2^31-1,另外还查了一下整形的最大范围unsigned long long, 0~2^64-1,也即20位10进制数
10进制整数是10位,因此用10digit足以
此外还要处理逆置后首位为0,其实对于一般情况可以拿过来处理了,
算法比较简单,我把负数都转为整数处理,最后再转回去,这样除的时候不会那么纠结,而且这样方便
附上代码:
这道题目其实小心处理,没太大难度,关键是还有溢出,其实题目对于溢出的也不需要处理,也即case里是没有溢出的,或者即使有,到判题时也skip掉。
10进制整数是10位,因此用10digit足以
此外还要处理逆置后首位为0,其实对于一般情况可以拿过来处理了,
算法比较简单,我把负数都转为整数处理,最后再转回去,这样除的时候不会那么纠结,而且这样方便
附上代码:
int reverse(int x) {
int digiti=9;//max 2^31-1, 10 digit most
int digit[10];
memset(digit,0,10*sizeof(int));
bool isnegative=false;//transform negative to positve, process together
if(x<0)
{
x=abs(x);
isnegative=true;
}
while(x>0)//get each digit into array
{
digit[digiti]=x/(int)pow(double(10),digiti);
x-=digit[digiti]*(int)pow(double(10),digiti);
digiti--;
}
int reversex=0;
int firstnonzeroi=9;//find lowest digit index
while(firstnonzeroi>=0&&digit[firstnonzeroi]==0)
firstnonzeroi--;
if(firstnonzeroi<0)//all zero
return 0;
int countxi=firstnonzeroi,weighti=0;//get reversedx value
while(countxi>=0)
{
reversex+=digit[countxi]*pow(10.0,weighti);
weighti++;
countxi--;
}
if(reversex>pow(2.0,31)-1) cout<<"reversed number overflow"<<endl;
if(isnegative)
reversex-=2*reversex;
return reversex;
}
这道题目其实小心处理,没太大难度,关键是还有溢出,其实题目对于溢出的也不需要处理,也即case里是没有溢出的,或者即使有,到判题时也skip掉。