思路:对于整数中出现1的次数,可以考虑利用取余和除法运算来求得。采用暴力循环。
对每一个数的每一位利除10取余来取得
对于任何数字出现的次数都可以利用这种方法求得,只不过余数要等于对应的数字X;
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n)
{
int temp;
int count=0;
for(int i=1;i<=n;i++)
{
temp=i;
while(temp!=0){
if(temp%10==1)
count++;
temp/=10;
}
}
return count;
}
};
一种高效的算法:
ublic int NumberOf1Between1AndN_Solution2(int n) {
int count = 0;
for (int i = 1; i <= n; i *= 10) {
int a = n / i,b = n % i;
//之所以补8,是因为当百位为0,则a/10==(a+8)/10,
//当百位>=2,补8会产生进位位,效果等同于(a/10+1)
count += (a + 8) / 10 * i + ((a % 10 == 1) ? b + 1 : 0);
}
return count;
}
对于n的阶乘中末尾0的个数问题:
阶乘中出现0,可以归根于2*5;而n的阶乘中2的个数远远大于5的个数,所以只要求出5的个数就可以知道末尾0的个数。
对于5的个数可以采用暴力循环的方法:
for (int i = 5; i <= n; i+=5)
{
int j = i;
while (j % 5 == 0)
{
count++;
j /= 5;
}
}
当然也可以根据规律:5中5的个数为1,10,15,20中5的个数为1,但25,125中5的个数为2,3.故25 的阶乘中5的个数为:6
故N中5的个数为:n=N/5+N/(5^2)+N/(5^3)....+N/(5^k) (k<=N/5)
while(n>0){
count+=n/5;
n=n/5;
}