uva 11038 - How Many O's?

本文介绍了一种高效算法来计算指定区间[m,n]内所有整数中数字0出现的次数。通过分位数分析的方法,利用递归思想计算每一位上0的数量,并通过实例代码演示了具体的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:求[m,n]中有多少个0

题解:分位数分析:
n的第i位不为0=n左边的数(高位)*10^(i-1)
n的第i位为0 =(n左边的数-1)*10^(i-1)+(i位右边的数+1)
ans=f(n)-f(m-1);

注意m为0的情况即可。


#include<cstdio>
#include<iostream>
#include<math.h>
#include<string.h>
using namespace std;
typedef long long LL;

LL find(LL l)
{
   LL k=0,n=1,res=0,m,r=0;
   while(l)
   {
      m=l%10;
      l=l/10;
      if(m)  res+=l*n;
      else   res=res+n*(l-1)+r+1;
      r+=m*n;
      n*=10;
   }
   return res;
}
int main()
{
    LL n,m,res;
    while(scanf("%lld %lld",&m,&n)&&(m>=0))
    {
     // cout<<find(m-1)<<"    "<<find(n)<<endl;
      res=find(n)-find(m-1);
      if(m==0) res++;
      printf("%lld\n",res);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值