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++ ,