zoukankan      html  css  js  c++  java
  • 九度oj 题目1373:整数中1出现的次数(从1到n整数中1出现的次数)

    题目描述:

    亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直困扰着他,特此他向JOBDU发来求助信,希望亲们能帮帮他。问题是:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。

    输入:

    输入有多组数据,每组测试数据为一行。

    每一行有两个整数a,b(0<=a,b<=1,000,000,000)。

    输出:

    对应每个测试案例,输出a和b之间1出现的次数。

    样例输入:
    0 5
    1 13
    21 55
    31 99
    
    样例输出:
    1
    6
    4
    7
    
    这个题目是按1491的思路来做的
    代码如下
     1 #include <cstdio>
     2 #include <cstring>
     3 
     4 char a[12], b[12];
     5 
     6 int main(void){
     7     
     8     while (scanf ("%s %s", a,b) != EOF) {
     9         int ra = 0;
    10         int numa = 0;
    11         int cnta1 = 0;
    12         int lena = strlen(a);
    13         for(int i = 0; i < lena; i++) {
    14             int q = 0;
    15             int tmp = a[i] - '0';
    16             if(tmp >= 1) {
    17                 q = 1;
    18             }
    19             ra = numa + q +   (ra - cnta1) * 10 + (tmp+1) * cnta1;
    20             //个位            //前位
    21             //for example 123
    22             // 12 + 1 + (F(12) - 1的个数 )*10 + 个位的个数 * 前面出现1的个数
    23             //               F(11)
    24             // 1--12 1 +  0 1
    25             numa = numa * 10 + tmp;
    26             if(tmp == 1) {
    27                 cnta1++;
    28             }
    29         }
    30         int rb = 0;
    31         int numb = 0;
    32         int cntb1 = 0;
    33         int lenb = strlen(b);
    34         for(int i = 0; i < lenb; i++) {
    35             int q = 0;
    36             int tmp = b[i] - '0';
    37             if(tmp >= 1) {
    38                 q = 1;
    39             }
    40             rb = numb + q + (rb - cntb1)*10 + (tmp+1)*cntb1;
    41             numb = numb * 10 + tmp;
    42             if(tmp == 1) {
    43                 cntb1++;
    44             }
    45         }
    46         int ans = 0;
    47         if(numb > numa) {
    48             ans = rb - (ra-cnta1);
    49         }
    50         else{
    51             ans = ra - (rb-cntb1);
    52         }
    53         printf("%d
    ",ans);
    54     }
    55         return 0;
    56 }

    一开始提交错误,因为题目中居然没有说a,b的大小关系。

    注意47行是numb和numa比较,而不是rb和 ra比较

  • 相关阅读:
    波卡(Polkadot)创始人Gavin Wood眼中加密世界
    DOT的目的是什么
    如何在波卡测试网上起验证人节点
    Polkadot波卡链众筹成本价与总量、创始人团队简介
    Polkadot验证节点的安全性和可用性
    RSA算法详解
    haproxy+keepalived原理特点
    haproxy+keepalived原理特点
    haproxy+keepalived原理特点
    python基础1习题练习
  • 原文地址:https://www.cnblogs.com/jasonJie/p/5810789.html
Copyright © 2011-2022 走看看