NBUTOJ1475: Bachelor

http://ac.nbutoj.com/Problem/view.xhtml?id=1475

  • 问题描述
  • 炎热的暑期集训就要结束了,在这短短的20天,大家都很努力,因为很多都是光棍嘛。balabala
    所以 Marknoon 先森一直耿耿于怀,毕竟他也是单身嘛。
    有一天,Marknoon 先森看着一串数字,发现了那个跟他同命相连的数字1,所以他就开始无聊起来,想知道从数字1到数字N,一共出现了几个1。
    例如N=12,则1的个数为5,出现1的数字分别为1,10,11,12。
  • 输入
  • 输入一个数N(1 <= N <= 2147483647)。
  • 输出
  • 输出从1到N中所有数字里出现 1 的个数。
  • 样例输入
  • 3
    13
    123
  • 样例输出
  • 1
    6
    57

     

    已经第三次看到这道题了,无力吐槽

    原理:http://blog.csdn.net/qingniaofy/article/details/8764926

     

    #include <stdio.h>
    #include <math.h>
    
    __int64 CountOne(__int64 n)//数1的个数
    {
        __int64 count =0;
        if (n ==0)
            count =0;
        else if (n >1&& n <10)
        count =1;
        else
        {
            __int64 highest = n;
            __int64 bit =0;
            while (highest >=10)
            {
                highest = highest /10;
                bit++;
            }
    
            __int64 weight = (__int64)pow(10, bit);
            if (highest ==1)
            {
                count = CountOne(weight -1)+ CountOne(n - weight)+ n - weight +1;
            }
            else
            {
                count = highest * CountOne(weight -1)+ CountOne(n - highest * weight) + weight;
            }
        }
        return count;
    }
    
    int main()
    {
        __int64 n;
        while(~scanf("%I64d",&n))
        {
            printf("%I64d\n",CountOne(n));
        }
    
        return 0;
    }
    
    
    


     

     

  • 你可能感兴趣的:(ACM,波大)