• 51Nod 1009 数字1的数量(思维)


    题目链接

    题目大意

      略

    解题思路

      可以逐位考虑当前数位上数字为1时的数字数量然后累加起来,因为每次只考虑当前数位的贡献,所以在计算过程中不存在重复的问题。
      举个例子,比如1361092,我们用x代替0~9十个数字。
      1.对于当前位的数字,如果大于1,比如说9的情况,那么十位为1的数字,也就是1x - 136101x就有((13610+1) imes 10))个,其中13610是比十位更高的数字,加上的1是当前十位上的1,为什么还乘十呢?因为后面有1个x,代表后面可以有10种数字。
      2.如果等于0呢?和第一种情况类似,不过需要向前借1,比如到了百位,就是1xx-13601xx,贡献就是((1361-1+1) imes 100))
      3.如果是1呢?这时候我们发现,加入1后面如果不全是9,是取不到上面那么多数的,比如1xxx-1361092,后者取到1092就结束了,不可能到9999,那么还采用第2种方法,向前借1,1xxx-1351xxx肯定是都能取到了,剩下的就是1361000-1361092了,这里取模就行了,所以贡献就是((136-1+1) imes 1000 + 1361092%1000))

    代码

    int main() {
        ll n; cin >> n;
        ll mul = 1, m = n, ans = 0;
        while(n) {
            ll res = n%10;
            if (res>1) ans += (n/10+1)*mul;
            else if (!res) ans += n/10*mul; 
            else ans += n/10*mul+m%mul+1;
            mul *= 10; n /= 10;
        }
        cout << ans << endl;
        return 0;   
    }
    
  • 相关阅读:
    java打包与热部署 爱上
    分组后最新的记录 爱上
    Js操作Excel常用方法 GO
    查找父元素和子元素 GO
    DataView不能按中文排序问题解决 GO
    浮动层居中的对话框效果演示 GO
    ajax form提交 GO
    SQL Server智能提示插件下载
    提高代码质量的三要素
    Div的宽度与高度设定100%
  • 原文地址:https://www.cnblogs.com/shuitiangong/p/13588604.html
Copyright © 2020-2023  润新知