问题描述:
1)到底怎样的整数才算是回文,或者说回文有什么特点?
答:整数必须是镜像即关于中间位对称,称该整数为回文。
2)负数到底算不算回文?
答:不算。
算法思路:
1)统计整数的位数,记为count;
2)根据count进行溢出判断,若溢出则return false;
3)判断该给定的整数是否为回文;
按照算法思路,我将它总结以下2方面进行介绍。一)如何统计整数的位数;二)如何去判断该给定的整数是否为回文。
一、如何统计整数的位数
这个比较简单,但是我还是单独写一块,方便以后查看。方法就是初始化count=1,然后将整数num除以10取整,判断是否(>=1),满足则count++, 且不断更新num的值。
片段代码:
for (count=1; (num=num/Pow(10,1))>=1;)
{
count++;
}
二、判断该给定的整数是否为回文
这块是整个代码的核心。由于不太好单独说明,所以详见代码注释。
for (i=1,j=count; i<j; i++,j--)
{
L_val=Pow(10,count-i);//提取当前位的被除数
_left=num/L_val;
left_compare=_left-L_buf*10;//<span style="font-family: Arial, Helvetica, sans-serif;">提取比较位</span>
L_buf=_left;//存值,为了提取比较位
R_val=Pow(10,count-j+1);
_right=num%R_val;
right_compare=_right/(Pow(10,count-j));
if (left_compare!=right_compare)
{
return false;
}
}
三、整个问题的源码
#define P_a 2147483647//consider int overflow
#define N_a -2147483648
int Pow(int x, int y)
{
int sum=1;
int i;
for (i=1; i<=y; i++)
{
sum=sum*x;
}
return sum;
}
bool isPalindrome(int x) {
int num=x;
int negtive_val;
int count;
int dis;
int flag=1;
int i,j;
int _left,_right;
int left_compare,right_compare;
int L_val,R_val;
int L_buf=0,R_buf=0;
//consider x is negtive
if (num==0)
{
return true;
}
if (num<0)
{
flag=-1;
negtive_val=num;
num=-num;
return false;
}
//count bit numbers
for (count=1; (num=num/Pow(10,1))>=1;)
{
count++;
}
// printf("count is %d\n",count);
//consider overflow
if (count>10)
{
printf("overflow\n");
return false;
}
else if (count==10)
{
if (num/Pow(10,count-1)>2)
{
printf("overflow\n");
return false;
}
}
if(flag<0)
{
dis=negtive_val-N_a;
if(dis<=0)
{
printf("overflow\n");
return false;
}
}
else if(flag>0)
{
dis=num-P_a;
if(dis>=0)
{
printf("overflow\n");
return false;
}
}
//over
num=x;
for (i=1,j=count; i<j; i++,j--)
{
L_val=Pow(10,count-i);
_left=num/L_val;
left_compare=_left-L_buf*10;
L_buf=_left;
R_val=Pow(10,count-j+1);
_right=num%R_val;
right_compare=_right/(Pow(10,count-j));
if (left_compare!=right_compare)
{
return false;
}
}
return true;
}