zoukankan      html  css  js  c++  java
  • 【剑指Offer面试编程题】题目1373:整数中1出现的次数--九度OJ

    题目描述:

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

    输入:

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

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

    输出:

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

    样例输入:

    0 5
    1 13
    21 55
    31 99
    样例输出:

    1
    6
    4
    7
    【解题思路】对于给定一个数,算包含的1的个数,我们可以将这个数分为很多部分,然后分别算1的个数。首先我们很容易得到一个n位数中1的个数,n位数1的个数等于n-1位数中1的个数与10相乘加上第n位为1的额外增加的个数pow(10,n-1)。

                  例如给定105,可以从第一位开始计算,首先是两位数0-99中1的个数,然后是100-105中首位1的个数为6,然后到第二位0,不计算。第三位5,计算0位数1个数0个,然后计算1这个数1的个数为1。最后将所有计算结果相加。

    AC code:

    #include <cstdio>
    #include <iostream>
    #include <string>
    #include <vector>
    #include <cmath>
    #include <cstring>
    #include <cstdlib>
    using namespace std;
     
    int clude(string &str,const int&k)
    {
      int re=0;
      for(int i=k;i<str.length();++i)
        re=re*10+str[i]-'0';
      return re;
    }
     
    int cal(const int &tt,const vector<int> &numidx)
    {
      if(tt<=0)
        return 0;
      int all=0;
      int idx;
      char strc[15];
      sprintf(strc,"%d",tt);
      string str(strc);
      for(int i=0,j=str.length()-1;i<str.length();++i,--j)
      {
        idx=str[i]-'0';
        if (idx==0)
          continue;
        else if(idx==1)
        {
          all+=clude(str,i+1);
          ++all;
          all+=numidx[j];
        }
        else
        {
          all+=pow(10.,j);
          all+=numidx[j]*idx;
        }
      }
      return all;
    }
     
    int main()
    {
      int a,b;
      vector<int> numidx(13,0);
      numidx[1]=1;
      for(int i=2;i<13;++i)
        numidx[i]=numidx[i-1]*10+pow(10.,i-1);
      while(cin>>a>>b)
      {
        if(a<b)
          printf("%d
    ",cal(b,numidx)-cal(a-1,numidx));
        else
          printf("%d
    ",cal(a,numidx)-cal(b-1,numidx));
      }
      return 0;
    }
    /**************************************************************
        Problem: 1373
        User: huo_yao
        Language: C++
        Result: Accepted
        Time:40 ms
        Memory:1520 kb
    ****************************************************************/
    题目链接:http://ac.jobdu.com/problem.php?pid=1373

    九度-剑指Offer习题全套答案下载:http://download.csdn.net/detail/huoyaotl123/8276299



    
    

  • 相关阅读:
    转: sql语句获取本周、本月数据
    Java 程序中的静态代码块
    Java 控制台程序输出计时器代码
    网页出现“繁体字”?
    html5中video视频只有声音没有图像
    Clipboard 剪辑板
    区分window8中 ie10 window phone8
    void 0
    touch pointer
    全局作用域 eval
  • 原文地址:https://www.cnblogs.com/huoyao/p/4248889.html
Copyright © 2011-2022 走看看