Uva(11038)(How Many O's? )

链接:https://vjudge.net/problem/UVA-11038
思路:虽然最后代码非常短,但是我觉得里面蕴含的巧妙的思想远远不止这些,首先算0个数肯定不能硬来,也不太好分区间算容易产生重叠,正解的方法是枚举原数的各个位置的数字,如果不为0,则该位前面的数字pow (10,后面数字个数)就是当前位为0的方案总数(例如12139,枚举第三位为0,方案书为12100),如果为0,则需要(前面-1)pow (10,后面数字个数)+后面+1(例如12039,当枚举第三位时,此时的个位为前面的11种后面的100种+39+1),这时最妙的来了,这样不会重叠或者说不是根本没有计算0有多少个吗,我们枚举的是当前为0的数的个数,试想一个数有很多个0,那么他的每个位置都会被枚举一次,从而这个数会被计算他0的个数那么多次,刚好就是我们要算的一共有多少0,这个实在是太妙了!!!!
代码:

#include<bits/stdc++.h>
using namespace std;
long long n,m;

long long num(long long x){
long long res = 1,ans = 0,xx=1;
    if(x<0)return 0;
    while(x>=10){
        long long mid = x%10;
        x/=10;
        if(mid)res+=x*xx;
        else res+=(x-1)*xx+(ans+1);
        ans = ans+mid*xx;
        xx*=10;
    }
    return res;
}

int main(){
    while(scanf("%lld%lld",&n,&m)&&n!=-1){
        printf("%lld\n",num(m)-num(n-1));
    }
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,677评论 0 13
  • 我院放射科于17年年底引进德国西门子16排螺旋CT机,并马上开展多部位三维重建,为临床科室提供更全面的影像...
    汉雨阅读 409评论 0 0
  • 北方的北方有一个叫多伦的小城 小城不大,冬日里会铺满冰雪 路转角早点铺整日弥漫着奶茶的醇香 街上的人们包裹着棉袄匆...
    驶入60号公路阅读 476评论 0 4
  • 此篇不适合鸡汤真爱粉食用。 此篇也不适合鸡汤绝缘体或者痛恨鸡汤者食用。 慎入,搞不好还是鸡汤。 正题 最近很讨厌鸡...
    日进斗金阅读 474评论 0 0
  • 你活得幸福不幸福,别人无从得知;但你快乐不快乐,别人一眼便知;但这一切最终来说,都与别人无关。
    未知一阅读 128评论 0 0

友情链接更多精彩内容