给定一个十进制正整数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
#include <bits/stdc++.h> using namespace std; int bit[8], dp[10]; int dfs(int len, bool lim, int num) { if(len == 0) return num; if(!lim && dp[len]!= -1) return dp[len]; int up = lim? bit[len] : 9; int ans = 0; for(int i = 0; i <= up; i++) { ans += dfs(len - 1, lim && i == up, num + (i==1)); } if(!lim) dp[len] = ans; return ans; } int sol(int n) { int len = 0; while(n) { bit[++len] = n % 10; n /= 10; } return dfs(len, 1, 0); } int main() { int n; cin>>n; memset(dp, -1, sizeof dp); printf("%d ", sol(n)); return 0; }