回文数:
方法一:
负数直接返回,整数直接求逆转之后的数(可能会溢出)
public boolean isPalindrome(int x) {
int num=x;
int sum=0;
while(x>0){
sum=sum*10+num%10;
num/=10;
}
return x==sum;
}
方法二:
求逆转一半的数,然后和未逆转的做比较。
逆转之后 res的位数可能和现在的x的的位数相等,也可能是现在的x的位数加1
位数相等:如果x=res 回文数 在这种情况下 x>res/10
位数不等:如果x=res/10 回文数 在这种情况下,x<res
我没有想到最后一位为零的数都不是回文数。
public boolean isPalindrome1(int x){
//如果是个负数,那么一定不是回文数
//如果该数的最后一位是0,那么就一定不是回文数(0除外)
if(x<0||(x%10==0&&x==0)) return false;
int res=0;
//如果我们只逆转x的一半的位数或者一半+1的位数,那么就一定不会溢出
while(res<x){
res=res*10+x%10;
x/=10;
}
//逆转之后 res的位数可能和现在的x的的位数相等,也可能是现在的x的位数加1
// 位数相等:如果x=res 回文数 在这种情况下 x>res/10
// 位数不等:如果x=res/10 回文数 在这种情况下,x<res
//因此可以写成一个
return x==res||x==res/10;
}
求最大公约数:
假设x,y(x>y)的最大公约数的最大公约数为为k,那么x-y也是k的倍数。
public static int get(int x,int y){
if(x%y==0) return y;
return get(Math.max(x-y,y),Math.min(x-y,y));
}