整数中1出现的次数

思路:对于整数中出现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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值