当前位置:编程学习 > C/C++ >>

NBUTOJ1475: Bachelor

问题描述 
炎热的暑期集训就要结束了,在这短短的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 
#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;
}

 


补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,