1.阶乘尾部0的个数:
class Solution {
public int trailingZeroes(int n) {
/*2*5=10 有一个0 因此判断n中包含的5及其倍数的个数
n/5+n/5^2+n/5^3+....
n/5表示不大于n的数中贡献一个
n/5^2不大于n的数中5^2贡献一个。。。*/
// return n==0?0:n/5+trailingZeroes(n/5);
int count=0;
while (n>0)
{
n=n/5;
count=count+n;
}
return count;
}
}
2.二进制相加==进位的问题是难点
class Solution {
public String addBinary(String a, String b) {
/*用carry表示两个位数相加是否进1
如果a[i]==1,carry+1;b[i]==1,carry+1
相加以后位数:0==carry%2;同时要进一位carry=carry/2
如果a[i]==1,carry+1;b[i]==0,carry
相加以后位数:carry+1==carry%2;同时进位carry=carry/2
*/
StringBuilder str=new StringBuilder();
int carry=0;
int i=a.length()-1,j=b.length()-1;
while(carry==1||i>=0||j>=0){
if(i>=0 && a.charAt(i--)=='1'){
carry++;
}
if(j>=0 && b.charAt(j--)=='1'){
carry++;
}
str.append(carry%2);
carry/=2;
}
return str.reverse().toString();
}
}
3.字符串相加=10进制相加
class Solution {
public String addStrings(String num1, String num2) {
/*与2进制加法同样的思路,但是要解决两个字符串长度不相等时候的进位问题
x=i<0?0:a[i]
这样就解决了进位和长度不相等的问题*/
StringBuilder str=new StringBuilder();
int i=num1.length()-1;
int j=num2.length()-1;
int carry=0;
while(i>=0||j>=0||carry==1){
int x=i<0?0:num1.charAt(i--)-'0';
int y=j<0?0 :num2.charAt(j--)-'0';
str.append((x+y+carry)%10);
carry=(x+y+carry)/10;
}
return str.reverse().toString();
}
}