给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。
例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。
Input
输入N(1 <= N <= 10^9)
Output
输出包含1的个数
Input示例
12
Output示例
5
这个用普通的暴力是肯定会超时,所以要找规律,规律在这个博客上http://www.cnblogs.com/jy02414216/archive/2011/03/09/1977724.html
那里介绍了三种方法,而我用的是第二种方法
代码如下
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<math.h> using namespace std; __int64 get_ans(int n) { __int64 count=0; if(n==0) { count=0; } else if(n>1&&n<10) { count=1; } else { int high=n; int bit=0; while(high>=10) { high=high/10; bit++; } int weight=pow(10,bit); if(high==1) { count+=get_ans(weight-1)+get_ans(n-weight)+n-weight+1; } else { count+=high*(get_ans(weight-1))+get_ans(n-high*weight)+weight; } } return count; } int main() { int n; scanf("%d",&n); printf("%lld",get_ans(n)); return 0; }